You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2015/03/30 17:43:30 UTC
[01/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Repository: isis
Updated Branches:
refs/heads/ISIS-789 64cb67344 -> e17c6857a (forced update)
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ServletRequestContext.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ServletRequestContext.java b/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ServletRequestContext.java
new file mode 100644
index 0000000..9b01b60
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ServletRequestContext.java
@@ -0,0 +1,373 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.MalformedURLException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.viewer.scimpi.dispatcher.DispatchException;
+import org.apache.isis.viewer.scimpi.dispatcher.ErrorCollator;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiNotFoundException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsers;
+
+public class ServletRequestContext extends RequestContext {
+ private HttpServletRequest request;
+ private HttpServletResponse response;
+ private ServletContext servletContext;
+ private boolean isAborted;
+
+ public ServletRequestContext(final DebugUsers debugUsers) {
+ super(debugUsers);
+ }
+
+ public void append(final DebugBuilder view) {
+ super.append(view);
+
+ /*
+ * view.divider("System"); Runtime.getRuntime().
+ */
+ view.startSection("HTTP Serviet Request");
+ view.appendTitle("General");
+ view.appendln("Auth type", request.getAuthType());
+ view.appendln("Character encoding", request.getCharacterEncoding());
+ view.appendln("Class", request.getClass());
+ view.appendln("Content type", request.getContentType());
+ view.appendln("Context path", getContextPath());
+ view.appendln("Locale", request.getLocale());
+ view.appendln("Method", request.getMethod());
+ view.appendln("Path info", request.getPathInfo());
+ view.appendln("Path translated", request.getPathTranslated());
+ view.appendln("Protocol", request.getProtocol());
+ view.appendln("Query string", request.getQueryString());
+ view.appendln("Remote host", request.getRemoteHost());
+ view.appendln("Remote user", request.getRemoteUser());
+ view.appendln("Real path", servletContext.getRealPath("/"));
+ view.appendln("Scheme", request.getScheme());
+ view.appendln("Server name", request.getServerName());
+ view.appendln("Servlet path", request.getServletPath());
+ view.appendln("Session", request.getSession());
+ view.appendln("Session ID", request.getRequestedSessionId());
+ view.appendln("URI", request.getRequestURI());
+ view.appendln("URL", request.getRequestURL());
+ view.appendln("User principle", request.getUserPrincipal());
+
+
+ final Cookie[] cookies = request.getCookies();
+ if (cookies != null) {
+ view.appendTitle("Cookies");
+ for (final Cookie cookie : cookies) {
+ view.appendln(cookie.getName(), cookie.getValue());
+ }
+ }
+
+ final Enumeration attributeNames = request.getAttributeNames();
+ if (attributeNames.hasMoreElements()) {
+ view.appendTitle("Attributes");
+ while (attributeNames.hasMoreElements()) {
+ final String name = (String) attributeNames.nextElement();
+ view.appendln(name, request.getAttribute(name));
+ }
+ }
+
+ view.appendTitle("Headers");
+ final Enumeration headerNames = request.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ final String name = (String) headerNames.nextElement();
+ view.appendln(name, request.getHeader(name));
+ }
+
+ view.appendTitle("Parameters");
+ final Enumeration parameterNames = request.getParameterNames();
+ while (parameterNames.hasMoreElements()) {
+ final String name = (String) parameterNames.nextElement();
+ view.appendln(name, request.getParameter(name));
+ }
+
+ view.appendTitle("Servlet Context");
+ final ServletContext context = getServletContext();
+ view.appendln("Name", context.getServletContextName());
+ view.appendln("Server Info", context.getServerInfo());
+ view.appendln("Version", context.getMajorVersion() + "." + context.getMinorVersion());
+ view.appendln("Attributes", getAttributes(context));
+ view.appendln("Init parameters", getParameters(context));
+ view.appendln("Real path", context.getRealPath("/"));
+ }
+
+ private String getAttributes(final ServletContext context) {
+ final StringBuffer buf = new StringBuffer();
+ final Enumeration names = context.getAttributeNames();
+ while (names.hasMoreElements()) {
+ final String name = (String) names.nextElement();
+ buf.append(name + "=" + context.getAttribute(name));
+ }
+ return buf.toString();
+ }
+
+ private String getParameters(final ServletContext context) {
+ final StringBuffer buf = new StringBuffer();
+ final Enumeration names = context.getInitParameterNames();
+ while (names.hasMoreElements()) {
+ final String name = (String) names.nextElement();
+ buf.append(name + "=" + context.getInitParameter(name));
+ }
+ return buf.toString();
+ }
+
+ public void startRequest(final HttpServletRequest request, final HttpServletResponse response, final ServletContext servletContext) {
+ this.request = request;
+ this.response = response;
+ this.servletContext = servletContext;
+ final Enumeration parameterNames = request.getParameterNames();
+ while (parameterNames.hasMoreElements()) {
+ final String name = (String) parameterNames.nextElement();
+ addParameter(name, request.getParameter(name));
+ }
+ initSession();
+ }
+
+ public HttpServletRequest getRequest() {
+ return request;
+ }
+
+ public HttpServletResponse getResponse() {
+ return response;
+ }
+
+ public ServletContext getServletContext() {
+ return servletContext;
+ }
+
+ @Override
+ public PrintWriter getWriter() {
+ try {
+ return response.getWriter();
+ } catch (final IOException e) {
+ throw new ScimpiException(e);
+ }
+ }
+
+ @Override
+ public String findFile(final String fileName) {
+ try {
+ if (getServletContext().getResource(fileName) == null) {
+ return null;
+ } else {
+ return fileName;
+ }
+ } catch (final MalformedURLException e) {
+ throw new ScimpiException(e);
+ }
+ }
+
+ @Override
+ public String getErrorDetails() {
+ return (String) getRequest().getAttribute("com.planchaser.error.details");
+ }
+
+ @Override
+ public String getErrorMessage() {
+ return (String) getRequest().getAttribute("com.planchaser.error.message");
+ }
+
+ @Override
+ public String getErrorReference() {
+ return (String) getRequest().getAttribute("com.planchaser.error.reference");
+ }
+
+ @Override
+ public InputStream openStream(final String path) {
+ final InputStream in = servletContext.getResourceAsStream(path);
+
+ if (in == null) {
+ servletContext.getResourcePaths("/");
+ try {
+ servletContext.getResource(path);
+ } catch (final MalformedURLException e) {
+ throw new ScimpiException(e);
+ }
+
+ throw new ScimpiNotFoundException("Cannot find file " + path);
+ }
+ return in;
+ }
+
+ @Override
+ public void startHttpSession() {
+ addVariable("_auth_session", getSession(), Scope.SESSION);
+ }
+
+ private void initSession(){
+ final HttpSession httpSession = request.getSession(true);
+ // TODO when using version 3.0 of Servlet API use the HttpOnly setting for improved security
+ if (httpSession.getAttribute("scimpi-context") == null) {
+ final Map<String, Object> sessionData = getSessionData();
+ httpSession.setAttribute("scimpi-context", sessionData);
+ } else {
+ final HashMap<String, Object> data = (HashMap<String, Object>) httpSession.getAttribute("scimpi-context");
+ if (data != null) {
+ setSessionData(data);
+ }
+ }
+ }
+
+ @Override
+ protected String getSessionId() {
+ return request.getSession().getId();
+ }
+
+ @Override
+ public String clearSession() {
+ request.getSession().invalidate();
+ return null;
+ }
+
+ @Override
+ public void reset() {
+ try {
+ response.getWriter().print("<h1>RESET</h1>");
+ } catch (final IOException e) {
+ throw new DispatchException(e);
+ }
+ response.reset();
+ }
+
+ @Override
+ public void forward(final String view) {
+ try {
+ isAborted = true;
+ getRequest().getRequestDispatcher(view).forward(getRequest(), getResponse());
+ } catch (final IOException e) {
+ throw new DispatchException(e);
+ } catch (final ServletException e) {
+ throw new DispatchException(e);
+ }
+ }
+
+ @Override
+ public void redirectTo(final String view) {
+ try {
+ isAborted = true;
+ getResponse().sendRedirect(view);
+ } catch (final IOException e) {
+ throw new DispatchException(e);
+ }
+ }
+
+ @Override
+ public void raiseError(final int status, final ErrorCollator errorDetails) {
+ try {
+ isAborted = true;
+ getRequest().setAttribute("com.planchaser.error.reference", errorDetails.getReference());
+ getRequest().setAttribute("com.planchaser.error.message", errorDetails.getMessage());
+ getRequest().setAttribute("com.planchaser.error.details", errorDetails.getDetails());
+ getResponse().sendError(status);
+ } catch (final IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public boolean isAborted() {
+ return isAborted;
+ }
+
+ @Override
+ public void setContentType(final String string) {
+ getResponse().setContentType(string);
+ }
+
+ @Override
+ public String imagePath(final ObjectAdapter object) {
+ final String contextPath = getContextPath();
+ return ImageLookup.imagePath(object, contextPath);
+ }
+
+ @Override
+ public String imagePath(final ObjectSpecification specification) {
+ final String contextPath = getContextPath();
+ return ImageLookup.imagePath(specification, contextPath);
+ }
+
+ @Override
+ public String getContextPath() {
+ return request.getContextPath();
+ }
+
+ @Override
+ public String getHeader(final String name) {
+ return request.getHeader(name);
+ }
+
+ @Override
+ public String getQueryString() {
+ return request.getQueryString();
+ }
+
+ @Override
+ public String getUri() {
+ return request.getRequestURI() + "?" + request.getQueryString();
+ }
+
+ @Override
+ public String getUrlBase() {
+ // return request.getScheme() + request.getServerName() +
+ // request.getServerPort();
+ final StringBuffer url = request.getRequestURL();
+ url.setLength(url.length() - request.getRequestURI().length());
+ return url.toString();
+ }
+
+ @Override
+ public void addCookie(final String name, final String value, final int minutesUtilExpires) {
+ final Cookie cookie = new Cookie(name, value);
+ cookie.setMaxAge(minutesUtilExpires * 60);
+ response.addCookie(cookie);
+ }
+
+ @Override
+ public String getCookie(final String name) {
+ final Cookie[] cookies = request.getCookies();
+ if (cookies != null) {
+ for (final Cookie cookie : cookies) {
+ if (cookie.getName().equals(name)) {
+ return cookie.getValue();
+ }
+ }
+ }
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/src/main/appended-resources/supplemental-models.xml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/src/main/appended-resources/supplemental-models.xml b/mothballed/component/viewer/scimpi/src/main/appended-resources/supplemental-models.xml
new file mode 100644
index 0000000..ecd3906
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/src/main/appended-resources/supplemental-models.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
+ license agreements. See the NOTICE file distributed with this work for additional
+ information regarding copyright ownership. The ASF licenses this file to
+ you under the Apache License, Version 2.0 (the "License"); you may not use
+ this file except in compliance with the License. You may obtain a copy of
+ the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
+ by applicable law or agreed to in writing, software distributed under the
+ License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+ OF ANY KIND, either express or implied. See the License for the specific
+ language governing permissions and limitations under the License. -->
+<supplementalDataModels xmlns="http://maven.apache.org/supplemental-model/1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/supplemental-model/1.0.0 http://maven.apache.org/xsd/supplemental-model-1.0.0.xsd">
+
+ <supplement>
+ <project>
+ <groupId>aopalliance</groupId>
+ <artifactId>aopalliance</artifactId>
+ <version>1.0</version>
+ <licenses>
+ <license>
+ <name>Public Domain</name>
+ </license>
+ </licenses>
+ </project>
+ </supplement>
+
+ <supplement>
+ <!-- not quite sure why licenses:download-license flags this, since license info seems to be in its POM -->
+ <project>
+ <groupId>org.datanucleus</groupId>
+ <artifactId>datanucleus-jodatime</artifactId>
+ <version>3.1.1</version>
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ </license>
+ </licenses>
+ </project>
+ </supplement>
+
+ <supplement>
+ <project>
+ <groupId>org.scannotation</groupId>
+ <artifactId>scannotation</artifactId>
+ <version>1.0.3</version>
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ </project>
+ </supplement>
+
+ <supplement>
+ <project>
+ <groupId>dom4j</groupId>
+ <artifactId>dom4j</artifactId>
+ <version>1.6.1</version>
+ <licenses>
+ <license>
+ <name>BSD License</name>
+ <url>http://dom4j.sourceforge.net/dom4j-1.6.1/license.html</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ </project>
+ </supplement>
+
+ <supplement>
+ <project>
+ <groupId>net.jcip</groupId>
+ <artifactId>jcip-annotations</artifactId>
+ <version>1.0</version>
+ <licenses>
+ <license>
+ <name>Creative Commons Attribution 2.5 License</name>
+ <url>http://creativecommons.org/licenses/by/2.5/</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ </project>
+ </supplement>
+
+
+ <supplement>
+ <project>
+ <groupId>xalan</groupId>
+ <artifactId>xalan</artifactId>
+ <version>2.7.0</version>
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ </project>
+ </supplement>
+
+
+</supplementalDataModels>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/pom.xml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/pom.xml b/mothballed/component/viewer/scimpi/tck/pom.xml
new file mode 100644
index 0000000..0c71d86
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.isis.tck</groupId>
+ <artifactId>isis-tck</artifactId>
+ <version>1.9.0-SNAPSHOT</version>
+ <relativePath>../../../../tck/pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-scimpi-tck</artifactId>
+ <name>Isis Scimpi Viewer TCK tests</name>
+
+ <properties>
+ <isis-viewer-scimpi.version>1.0.0-SNAPSHOT</isis-viewer-scimpi.version>
+ <isis-objectstore-xml.version>1.0.0-SNAPSHOT</isis-objectstore-xml.version>
+ <isis-profilestore-xml.version>1.0.0-SNAPSHOT</isis-profilestore-xml.version>
+ <isis-security-file.version>1.6.0-SNAPSHOT</isis-security-file.version>
+
+ <siteBaseDir>..</siteBaseDir>
+ <relativeUrl>scimpi-tck/</relativeUrl>
+ <!-- until someone comes up with a better solution -->
+ <distMgmtSiteUrl>file:///tmp/m2-sites/isis/viewer/scimpi</distMgmtSiteUrl>
+ </properties>
+
+ <packaging>war</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+
+ <!-- other modules in this project -->
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-tck-dom</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-tck-fixture</artifactId>
+ </dependency>
+
+
+ <!-- isis non-core components -->
+ <dependency>
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-scimpi-servlet</artifactId>
+ <version>${isis-viewer-scimpi.version}</version>
+ </dependency>
+
+
+ <!-- isis runtime -->
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-runtime</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-security</artifactId>
+ </dependency>
+
+ <!-- to run using WebServer -->
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-webserver</artifactId>
+ <scope>runtime</scope>
+ <optional>true</optional>
+ </dependency>
+
+ </dependencies>
+
+</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/resources/images/Default.png
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/resources/images/Default.png b/mothballed/component/viewer/scimpi/tck/src/main/resources/images/Default.png
new file mode 100644
index 0000000..8409e46
Binary files /dev/null and b/mothballed/component/viewer/scimpi/tck/src/main/resources/images/Default.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/edit-selector.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/edit-selector.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/edit-selector.shtml
new file mode 100644
index 0000000..724ac7a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/edit-selector.shtml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title>Edit <swf:title icon="no" /></swf:page-title>
+<swf:template file="../style/template.shtml" />
+
+<h2>Edit <swf:title /></h2>
+<swf:edit>
+ <swf:selector field="claimant" object="service:claimants" method="findEmployees" title="Employees..."/>
+ <swf:selector field="approver" object="service:claimants" method="findEmployees" title="Employees..."/>
+</swf:edit>
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-link.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-link.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-link.shtml
new file mode 100644
index 0000000..406f42c
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-link.shtml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title><swf:title icon="no" /></swf:page-title>
+<swf:template file="../style/template.shtml" />
+
+<h2><swf:title /></h2>
+<swf:short-form>
+ <swf:link name="claimant"/>
+</swf:short-form>
+
+<swf:methods/>
+
+
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-orig.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-orig.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-orig.shtml
new file mode 100644
index 0000000..deb6d66
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-orig.shtml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title><swf:title icon="no" /></swf:page-title>
+<swf:template file="../style/template.shtml" />
+
+<h2><swf:title /></h2>
+
+<swf:long-form />
+
+<swf:methods />
+
+
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object.shtml
new file mode 100644
index 0000000..f1865ce
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object.shtml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title><swf:title icon="no" /></swf:page-title>
+<swf:template file="../style/template.shtml" />
+
+<h2><swf:title /></h2>
+<swf:short-form>
+ <swf:exclude name="approver"/>
+</swf:short-form>
+
+<swf:methods>
+ <swf:exclude name="submit"/>
+</swf:methods>
+
+
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object2.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object2.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object2.shtml
new file mode 100644
index 0000000..f07c718
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object2.shtml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title><swf:title icon="no" /></swf:page-title>
+<swf:template file="../style/template.shtml" />
+
+<h2><swf:title /></h2>
+<swf:short-form>
+</swf:short-form>
+
+<swf:methods>
+</swf:methods>
+
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/isis.properties b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/isis.properties
new file mode 100644
index 0000000..d8aab34
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/isis.properties
@@ -0,0 +1,54 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+isis.services.prefix = org.apache.isis.tck.objstore.dflt
+isis.services =\
+ scalars.ApplibValuedEntityRepositoryDefault,\
+ scalars.JdkValuedEntityRepositoryDefault,\
+ scalars.PrimitiveValuedEntityRepositoryDefault,\
+ scalars.WrapperValuedEntityRepositoryDefault, \
+ simples.SimpleEntityRepositoryDefault,\
+ assocs.ParentEntityRepositoryDefault
+
+isis.fixtures.prefix= org.apache.isis.tck.fixture
+isis.fixtures=\
+ LogonAsSvenFixture,\
+ scalars.ApplibValuedEntityFixture,\
+ scalars.JdkValuedEntityFixture,\
+ scalars.PrimitiveValuedEntityFixture,\
+ scalars.WrapperValuedEntityFixture,\
+ simples.SimpleEntityFixture,\
+ assocs.ParentAndChildEntityFixture
+
+isis.exploration.users=sven, dick, bob
+
+
+
+isis.persistor.object-factory=org.apache.isis.runtimes.dflt.bytecode.dflt.objectfactory.CglibObjectFactory
+#isis.persistor.object-factory=org.apache.isis.runtimes.dflt.bytecode.javassist.objectfactory.JavassistObjectFactory
+#isis.persistor.object-factory=org.apache.isis.runtimes.dflt.bytecode.identity.objectfactory.ObjectFactoryBasic
+
+
+isis.persistor.domain-object-container=org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault
+#isis.persistor.domain-object-container=org.apache.isis.progmodel.wrapper.metamodel.DomainObjectContainerWrapperFactory
+
+
+#isis.reflector.facets.include=org.apache.isis.runtimes.dflt.runtime.authorization.standard.AuthorizationFacetFactoryImpl
+#isis.authorization.learn=true
+
+
+isis.persistor=in-memory
+#isis.xmlos.dir=/tmp/xml
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/logging.properties
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/logging.properties b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/logging.properties
new file mode 100644
index 0000000..f2d65e6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/logging.properties
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# apache's log4j is used to provide system logging.
+log4j.rootCategory=INFO, Console
+
+# The console appender
+log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.target=System.out
+log4j.appender.Console.layout=org.apache.log4j.PatternLayout
+log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n
+
+log4j.appender.File=org.apache.log4j.RollingFileAppender
+log4j.appender.File.file=isis.log
+log4j.appender.File.append=false
+log4j.appender.File.layout=org.apache.log4j.PatternLayout
+log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p] %m%n
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.allow
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.allow b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.allow
new file mode 100644
index 0000000..928983a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.allow
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.passwords
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.passwords b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.passwords
new file mode 100644
index 0000000..7f07af5
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.passwords
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+sven:pass
+dick:pass
+bob:pass
+joe:pass
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/web.xml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..3e61f54
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<web-app id="WebApp_ID" version="2.4"
+ xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+ <display-name>Apache Isis S Viewer</display-name>
+
+ <welcome-file-list>
+ <welcome-file>index.shtml</welcome-file>
+ </welcome-file-list>
+
+ <listener>
+ <listener-class>org.apache.isis.core.webapp.IsisWebAppBootstrapper</listener-class>
+ </listener>
+
+ <context-param>
+ <param-name>isis.viewers</param-name>
+ <param-value>scimpi</param-value>
+ </context-param>
+
+ <servlet>
+ <servlet-name>dispatcher</servlet-name>
+ <servlet-class>org.apache.isis.viewer.scimpi.servlet.DispatcherServlet</servlet-class>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>dispatcher</servlet-name>
+ <url-pattern>*.shtml</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>dispatcher</servlet-name>
+ <url-pattern>*.app</url-pattern>
+ </servlet-mapping>
+
+</web-app>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/debug.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/debug.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/debug.shtml
new file mode 100644
index 0000000..93550cf
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/debug.shtml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:template file="style/template.shtml"/>
+
+<swf:services/>
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/action.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/action.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/action.shtml
new file mode 100644
index 0000000..b72bb04
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/action.shtml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title>Action <swf:action-name method="${method}"/></swf:page-title>
+<swf:template file="../style/template.shtml" />
+
+<h2>${title}</h2>
+<swf:action-form method="${method}" view="_generic.shtml"/>
+
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/collection.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/collection.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/collection.shtml
new file mode 100644
index 0000000..823046f
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/collection.shtml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title><swf:element-type /> Listing</swf:page-title>
+<swf:template file="../style/template.shtml" />
+
+<h2>${title}</h2>
+<swf:table link="_generic.shtml" />
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/edit.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/edit.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/edit.shtml
new file mode 100644
index 0000000..6d47bfc
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/edit.shtml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title>Edit <swf:title icon="no" /></swf:page-title>
+<swf:template file="../style/template.shtml" />
+
+<h2>Edit <swf:title /></h2>
+<swf:edit />
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/object.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/object.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/object.shtml
new file mode 100644
index 0000000..18fa5da
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/generic/object.shtml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title><swf:title icon="no" /></swf:page-title>
+<swf:template file="../style/template.shtml" />
+
+<h2><swf:title /></h2>
+<swf:long-form link="_generic.shtml" />
+
+<swf:methods />
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/Claim.png
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/Claim.png b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/Claim.png
new file mode 100644
index 0000000..478f115
Binary files /dev/null and b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/Claim.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/ClaimItem.png
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/ClaimItem.png b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/ClaimItem.png
new file mode 100644
index 0000000..d85fd82
Binary files /dev/null and b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/ClaimItem.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/Employee.png
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/Employee.png b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/Employee.png
new file mode 100644
index 0000000..6cf2bd4
Binary files /dev/null and b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/Employee.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/banner-bg.png
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/banner-bg.png b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/banner-bg.png
new file mode 100644
index 0000000..830e843
Binary files /dev/null and b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/banner-bg.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/banner.png
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/banner.png b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/banner.png
new file mode 100644
index 0000000..f81e331
Binary files /dev/null and b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/banner.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/logo.png
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/logo.png b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/logo.png
new file mode 100644
index 0000000..ea4cbc1
Binary files /dev/null and b/mothballed/component/viewer/scimpi/tck/src/main/webapp/images/logo.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/index.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/index.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/index.shtml
new file mode 100644
index 0000000..e9281cf
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/index.shtml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:page-title>Claims App</swf:page-title>
+
+<swf:template file="style/template.shtml" />
+
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/login.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/login.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/login.shtml
new file mode 100644
index 0000000..a427a54
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/login.shtml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<swf:template file="style/template.shtml" />
+
+<h2>Please Log On</h2>
+<swf:logon/>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/style/screen.css
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/style/screen.css b/mothballed/component/viewer/scimpi/tck/src/main/webapp/style/screen.css
new file mode 100644
index 0000000..f990946
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/style/screen.css
@@ -0,0 +1,394 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+BODY {
+ font-family: Arial, Sans-Serif;
+ margin: 0 0 10px 0;
+ color: black;
+ background-color: #f0f0f0;
+}
+
+/*
+* Banner
+*/
+div#banner {
+ background-image: url(../images/banner-bg.png);
+ background-repeat: repeat-x;
+ width: 100%;
+ height: 120px;
+}
+
+/*
+* Content below banner
+*/
+div#content {
+ display: block;
+}
+
+div#content div#side {
+ display: inline;
+ float: left;
+ width: 150px;
+ padding: 25px 10px;
+}
+
+div#side ul {
+ margin: 0;
+ padding: 0;
+}
+
+div#side li {
+ display: block;
+ font-size: 80%;
+ padding: 4px 0;
+}
+
+div#content div#main{
+ padding: 1em;
+ float:left;
+ width:70%;
+}
+
+/*
+* Feedback area
+*/
+.feedback {
+ border: 2px solid red;
+ background-color: #ffccff;
+ padding: 20px 10px;
+}
+
+.warning {
+ color: red;
+ font-style: italic;
+}
+
+.message {
+ color: blue;
+}
+
+.error {
+ color: red;
+ font-size: 80%;
+ padding-left: 6px;
+}
+
+/*
+* Debug
+*/
+
+div.debug {
+ display: block;
+ padding: 10px;
+ border: 1px solid gray;
+ background-color: #ddd;
+}
+
+/*
+* Headings
+*/
+h1, h2, h3, h4 {
+ color: blue;
+}
+
+
+/*
+* Hyper links
+*/
+a {
+ color: blue;
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a:visted {
+ color: blue;
+ text-decoration: none;
+}
+
+/*
+* Icons
+*/
+img.title-icon {
+ height: 32px;
+ padding-right: 6px;
+}
+
+img.small-icon {
+ height: 16px;
+ padding-right: 6px;
+ vertical-align: text-bottom;
+}
+
+
+/*
+* Actions
+*/
+div.actions {
+
+}
+
+div.actions div.actions {
+ border: 0px;
+ padding: 0px;
+}
+
+div.actions h2 {
+ font-size: 90%;
+}
+
+div.actions h3 {
+ font-size: 80%;
+}
+
+div.actions div.action,
+a.action
+{
+ padding 2px;
+ margin: 4px 0;
+ height: 1.6em;
+}
+
+div.action INPUT,
+div.action a,
+a.action,
+div.action span.disabled
+{
+ font-size: 80%;
+ background-color: silver;
+ border: 1px solid #333399;
+ background: url(../images/bg-button.gif);
+ background-repeat: repeat-x;
+}
+
+div.action INPUT[type="hidden"]
+{
+ background: none;
+ border: none;
+}
+
+div.action a,
+a.action,
+div.action span.disabled {
+ padding: 1px 10px;
+}
+
+.action INPUT,
+a.action,
+.action a:link {
+ color: #000000;
+}
+
+.action INPUT,
+a.action,
+.action a:visited {
+ color: #000000;
+}
+
+.action INPUT,
+a.action,
+.action a:hover {
+ color: #000000;
+ text-decoration: none;
+}
+
+div.action span.disabled {
+ color: #555;
+}
+
+/*
+* Edit forms
+*/
+fieldset {
+ padding: 5px 10px;
+}
+
+fieldset div.field {
+ padding: 4px 0px;
+ min-height: 1.3em;
+}
+
+fieldset label {
+ float: left;
+ width:140px;
+ font-weight: bold;
+}
+
+fieldset input {
+ padding: 0px 0;
+}
+
+fieldset textarea {
+ font-family: Arial, Sans-Serif;
+}
+
+form input.button {
+ font-size: 80%;
+ background-color: silver;
+ border: 1px solid #333399;
+ background: url(../images/bg-button.gif);
+ background-repeat: repeat-x;
+ padding: 1px 0;
+}
+
+/*
+* Display forms
+*/
+div.form {
+ padding: 5px 0;
+}
+
+XXdiv.form * {
+ border: 1px solid red;
+}
+
+div.form div.field {
+ padding: 4px 6px;
+ min-height: 1.3em;
+}
+
+div.form div.odd-row {
+ background-color: #e7e7e7;
+}
+
+div.form div.even-row {
+ background-color: #eee;
+}
+
+div.form span.label {
+ float: left;
+ font-weight: bold;
+}
+
+div.form span.value {
+ display: block;
+ padding-left: 12em;
+ max-width: 45em;
+}
+
+
+
+/*
+* collections
+*/
+
+#store .entry {
+ border-bottom: 1px dotted #7745FF;
+ padding: 10px 0;
+}
+
+table {
+ border: 0px;
+ padding-bottom: 10px;
+}
+
+th {
+ background-color: #bbb;
+}
+
+tr.odd-row {
+ background-color: #eee;
+}
+
+tr.even-row {
+ background-color: #e7e7e7;
+}
+
+td {
+ vertical-align: top;
+ padding: 4px 10px;
+}
+
+tr:hover {
+ border: 1px solid black;
+ background-color: #eea;
+}
+
+
+
+
+
+/*
+* Application specific
+*/
+div.book {
+ padding-bottom: 10px;
+ border-bottom: 2px dashed;
+}
+
+div.cover {
+ float: left;
+ padding-right: 30px;
+ padding-bottom: 8px;
+}
+
+
+.title {
+ color: white;
+ font-size: 120%;
+ font-weight: bold;
+ margin-left: 5px;
+}
+
+.description {}
+
+.price {
+ display: inline;
+ font-weight: bold;
+ text-align: left;
+ margin-right: 20px;
+}
+
+form, input {
+ display: inline;
+}
+
+
+div#cart {
+ float: right;
+ width: 160px;
+ font-size: 70%;
+ border: 1px solid gray;
+ margin: 10px;
+ padding: 10px;
+}
+
+div#cart ul {
+ padding: 0;
+
+}
+
+div#cart li {
+ display: block;
+ padding-bottom: 4px;
+}
+
+
+
+form.selector fieldset {
+ margin-left: 45px;
+ font-size: 80%;
+}
+
+form.selector legend {
+ font-style: italic;
+}
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/tck/src/main/webapp/style/template.shtml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/tck/src/main/webapp/style/template.shtml b/mothballed/component/viewer/scimpi/tck/src/main/webapp/style/template.shtml
new file mode 100644
index 0000000..0774613
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/tck/src/main/webapp/style/template.shtml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<title>${title}</title>
+<link rel="stylesheet" title="Style 1" href="${_context}/style/screen.css" type="text/css" media="all" />
+</head>
+
+<body id="demo">
+
+<div id="banner">
+ <div class="logo"><img src="images/logo.png"/></div>
+ <div class="title">To-Do App</div>
+</div>
+
+<div id="content">
+ <div id="side">
+ <swf:services />
+ </div>
+ <div id="main">
+ <swf:feedback />
+ <swf:content />
+
+ <swf:diagnostics/>
+ </div>
+</div>
+
+</body>
+</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 1fa8060..23293a6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,8 +55,6 @@
<module>example/application/simpleapp</module>
<module>example/archetype/simpleapp</module>
-
- <module>component/viewer/scimpi</module>
</modules>
</profile>
[47/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/scripts/vendor.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/scripts/vendor.js b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/scripts/vendor.js
deleted file mode 100644
index c4c3f2d..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/scripts/vendor.js
+++ /dev/null
@@ -1,10 +0,0 @@
-if(function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b=a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(hb.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=ob[a]={};return _.each(a.match(nb)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.
cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ub,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:tb.test(c)?_.parseJSON(c):c}catch(e){}sb.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Kb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)rb.set(a[c],"globalEval",!b||rb.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(rb.hasData(a)&&(f=rb.access(a),g=rb.set(b
,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sb.hasData(a)&&(h=sb.access(a),i=_.extend({},h),sb.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&yb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Ob[a];return c||(c=t(a,b),"none"!==c&&c||(Nb=(Nb||_("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=Nb[0].contentDocument,b.write(),b.close(),c=t(a,b),Nb.detach()),Ob[a]=c),c}function v(a,b,c){var d,e,f,g,h=a.style;return c=c||Rb(a),c&&(g=c.getProp
ertyValue(b)||c[b]),c&&(""!==g||_.contains(a.ownerDocument,a)||(g=_.style(a,b)),Qb.test(g)&&Pb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function w(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function x(a,b){if(b in a)return b;for(var c=b[0].toUpperCase()+b.slice(1),d=b,e=Xb.length;e--;)if(b=Xb[e]+c,b in a)return b;return d}function y(a,b,c){var d=Tb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=_.css(a,c+wb[f],!0,e)),d?("content"===c&&(g-=_.css(a,"padding"+wb[f],!0,e)),"margin"!==c&&(g-=_.css(a,"border"+wb[f]+"Width",!0,e))):(g+=_.css(a,"padding"+wb[f],!0,e),"padding"!==c&&(g+=_.css(a,"border"+wb[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Rb(a),g="border-box"
===_.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=v(a,b,f),(0>e||null==e)&&(e=a.style[b]),Qb.test(e))return e;d=g&&(Y.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=rb.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&xb(d)&&(f[g]=rb.access(d,"olddisplay",u(d.nodeName)))):(e=xb(d),"none"===c&&e||rb.set(d,"olddisplay",e?c:_.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function C(a,b,c,d,e){return new C.prototype.init(a,b,c,d,e)}function D(){return setTimeout(function(){Yb=void 0}),Yb=_.now()}function E(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=wb[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function F(a,b,c){for(var d,e=(cc[b]||[]).concat(cc["*"]),f=0,g=e.l
ength;g>f;f++)if(d=e[f].call(c,b,a))return d}function G(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},n=a.style,o=a.nodeType&&xb(a),p=rb.get(a,"fxshow");c.queue||(h=_._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,_.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[n.overflow,n.overflowX,n.overflowY],j=_.css(a,"display"),k="none"===j?rb.get(a,"olddisplay")||u(a.nodeName):j,"inline"===k&&"none"===_.css(a,"float")&&(n.display="inline-block")),c.overflow&&(n.overflow="hidden",l.always(function(){n.overflow=c.overflow[0],n.overflowX=c.overflow[1],n.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],$b.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(o?"hide":"show")){if("show"!==e||!p||void 0===p[d])continue;o=!0}m[d]=p&&p[d]||_.style(a,d)}else j=void 0;if(_.isEmptyObject(m))"inline"===("none"===j?u(a.nodeName):j)&&(n.displ
ay=j);else{p?"hidden"in p&&(o=p.hidden):p=rb.access(a,"fxshow",{}),f&&(p.hidden=!o),o?_(a).show():l.done(function(){_(a).hide()}),l.done(function(){var b;rb.remove(a,"fxshow");for(b in m)_.style(a,b,m[b])});for(d in m)g=F(o?p[d]:0,d,l),d in p||(p[d]=g.start,o&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function H(a,b){var c,d,e,f,g;for(c in a)if(d=_.camelCase(c),e=b[d],f=a[c],_.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=_.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function I(a,b,c){var d,e,f=0,g=bc.length,h=_.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Yb||D(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:_.extend({},b),opts:_.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c
,startTime:Yb||D(),duration:c.duration,tweens:[],createTween:function(b,c){var d=_.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(H(k,j.opts.specialEasing);g>f;f++)if(d=bc[f].call(j,a,k,j.opts))return d;return _.map(k,F,j),_.isFunction(j.opts.start)&&j.opts.start.call(a,j),_.fx.timer(_.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function J(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(nb)||[];if(_.isFunction(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function K(a,b,c,d){function e(h){var i;return f[h]=!0,_.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeo
f j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===vc;return e(b.dataTypes[0])||!f["*"]&&e("*")}function L(a,b){var c,d,e=_.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&_.extend(!0,a,d),a}function M(a,b,c){for(var d,e,f,g,h=a.contents,i=a.dataTypes;"*"===i[0];)i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function N(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];for(f=k.shift();f;)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+"
"+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}function O(a,b,c,d){var e;if(_.isArray(b))_.each(b,function(b,e){c||zc.test(a)?d(a,e):O(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==_.type(b))d(a,b);else for(e in b)O(a+"["+e+"]",b[e],c,d)}function P(a){return _.isWindow(a)?a:9===a.nodeType&&a.defaultView}var Q=[],R=Q.slice,S=Q.concat,T=Q.push,U=Q.indexOf,V={},W=V.toString,X=V.hasOwnProperty,Y={},Z=a.document,$="2.1.1",_=function(a,b){return new _.fn.init(a,b)},ab=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bb=/^-ms-/,cb=/-([\da-z])/gi,db=function(a,b){return b.toUpperCase()};_.fn=_.prototype={jquery:$,constructor:_,selector:"",length:0,toArray:function(){return R.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:R.call(this)},pushStack:function(a){var b
=_.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return _.each(this,a,b)},map:function(a){return this.pushStack(_.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(R.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:T,sort:Q.sort,splice:Q.splice},_.extend=_.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||_.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(_.isPlainObject(d)||(e=_.isArray(d)))?(e?(e=!1,f=c&&_.isArray(c)?c:[]):f=c&&_.isPlainObject(c)?c:{},g[b]=_.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},_.extend({e
xpando:"jQuery"+($+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===_.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!_.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==_.type(a)||a.nodeType||_.isWindow(a)?!1:a.constructor&&!X.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?V[W.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=_.trim(a),a&&(1===a.indexOf("use strict")?(b=Z.createElement("script"),b.text=a,Z.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(bb,"ms-").replace(cb,db)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.le
ngth,h=c(a);if(d){if(h)for(;g>f&&(e=b.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=b.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=b.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),e===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(ab,"")},makeArray:function(a,b){var d=b||[];return null!=a&&(c(Object(a))?_.merge(d,"string"==typeof a?[a]:a):T.call(d,a)),d},inArray:function(a,b,c){return null==b?-1:U.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,d){var e,f=0,g=a.length,h=c(a),i=[];if(h)for(;g>f;f++)e=b(a[f],f,d),null!=e&&i.push(e);else for(f in a)e=b(a[f],f,d),null!=e&&i.push(e);return S.apply([],i)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),_.isFunction(a)?(d=R.call(arguments,2),e=function(){return a.apply(b||t
his,d.concat(R.call(arguments)))},e.guid=a.guid=a.guid||_.guid++,e):void 0},now:Date.now,support:Y}),_.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){V["[object "+b+"]"]=b.toLowerCase()});var eb=function(a){function b(a,b,c,d){var e,f,g,h,i,j,l,n,o,p;if((b?b.ownerDocument||b:O)!==G&&F(b),b=b||G,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(I&&!d){if(e=sb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&M(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return _.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&v.getElementsByClassName&&b.getElementsByClassName)return _.apply(c,b.getElementsByClassName(g)),c}if(v.qsa&&(!J||!J.test(a))){if(n=l=N,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(j=z(a),(l=b.getAttribute("id"))?n=l.replace(ub,"\\$&"):b.setAttribute("id",
n),n="[id='"+n+"'] ",i=j.length;i--;)j[i]=n+m(j[i]);o=tb.test(a)&&k(b.parentNode)||b,p=j.join(",")}if(p)try{return _.apply(c,o.querySelectorAll(p)),c}catch(q){}finally{l||b.removeAttribute("id")}}}return B(a.replace(ib,"$1"),b,c,d)}function c(){function a(c,d){return b.push(c+" ")>w.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[N]=!0,a}function e(a){var b=G.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=a.length;d--;)w.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return d(fu
nction(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function k(a){return a&&typeof a.getElementsByTagName!==V&&a}function l(){}function m(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function n(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=Q++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[P,f];if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e){if(i=b[N]||(b[N]={}),(h=i[d])&&h[0]===P&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function o(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,c,d){for(var e=0,f=c.length;f>e;e++)b(a,c[e],d);return d}function q(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function r(a,b,c,e,f,g){return e&&!e[N]&&(e=
r(e)),f&&!f[N]&&(f=r(f,g)),d(function(d,g,h,i){var j,k,l,m=[],n=[],o=g.length,r=d||p(b||"*",h.nodeType?[h]:h,[]),s=!a||!d&&b?r:q(r,m,a,h,i),t=c?f||(d?a:o||e)?[]:g:s;if(c&&c(s,t,h,i),e)for(j=q(t,n),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[n[k]]=!(s[n[k]]=l));if(d){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?bb.call(d,l):m[k])>-1&&(d[j]=!(g[j]=l))}}else t=q(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function s(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return bb.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==C)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=w.relative[a[h].type])k=[n(o(k),c)];else{if(c=w.filter[a[h].type].apply(null,a[h].matches),c[N]){for(d=++h;e>d&&!w.relative[a[d].type];d++);return r(h>1&&o(k),h>1&&m(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ib,"$1"),
c,d>h&&s(a.slice(h,d)),e>d&&s(a=a.slice(d)),e>d&&m(a))}k.push(c)}return o(k)}function t(a,c){var e=c.length>0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],r=[],s=C,t=d||f&&w.find.TAG("*",j),u=P+=null==s?1:Math.random()||.1,v=t.length;for(j&&(C=g!==G&&g);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0;m=a[l++];)if(m(k,g,h)){i.push(k);break}j&&(P=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,r,g,h);if(d){if(n>0)for(;o--;)p[o]||r[o]||(r[o]=Z.call(i));r=q(r)}_.apply(i,r),j&&!d&&r.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(P=u,C=s),p};return e?d(g):g}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P=0,Q=0,R=c(),S=c(),T=c(),U=function(a,b){return a===b&&(E=!0),0},V="undefined",W=1<<31,X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,ab=Y.slice,bb=Y.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},cb="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hid
den|ismap|loop|multiple|open|readonly|required|scoped",db="[\\x20\\t\\r\\n\\f]",eb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",fb=eb.replace("w","w#"),gb="\\["+db+"*("+eb+")(?:"+db+"*([*^$|!~]?=)"+db+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+fb+"))|)"+db+"*\\]",hb=":("+eb+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+gb+")*)|.*)\\)|)",ib=new RegExp("^"+db+"+|((?:^|[^\\\\])(?:\\\\.)*)"+db+"+$","g"),jb=new RegExp("^"+db+"*,"+db+"*"),kb=new RegExp("^"+db+"*([>+~]|"+db+")"+db+"*"),lb=new RegExp("="+db+"*([^\\]'\"]*?)"+db+"*\\]","g"),mb=new RegExp(hb),nb=new RegExp("^"+fb+"$"),ob={ID:new RegExp("^#("+eb+")"),CLASS:new RegExp("^\\.("+eb+")"),TAG:new RegExp("^("+eb.replace("w","w*")+")"),ATTR:new RegExp("^"+gb),PSEUDO:new RegExp("^"+hb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+db+"*(even|odd|(([+-]|)(\\d*)n|)"+db+"*(?:([+-]|)"+db+"*(\\d+)|))"+db+"*\\)|)","i"),bool:new RegExp("^(?:"+cb+")$","i"),needsContext:
new RegExp("^"+db+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+db+"*((?:-\\d)?\\d*)"+db+"*\\)|)(?=[^-]|$)","i")},pb=/^(?:input|select|textarea|button)$/i,qb=/^h\d$/i,rb=/^[^{]+\{\s*\[native \w/,sb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tb=/[+~]/,ub=/'|\\/g,vb=new RegExp("\\\\([\\da-f]{1,6}"+db+"?|("+db+")|.)","ig"),wb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{_.apply(Y=ab.call(O.childNodes),O.childNodes),Y[O.childNodes.length].nodeType}catch(xb){_={apply:Y.length?function(a,b){$.apply(a,ab.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}v=b.support={},y=b.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},F=b.setDocument=function(a){var b,c=a?a.ownerDocument||a:O,d=c.defaultView;return c!==G&&9===c.nodeType&&c.documentElement?(G=c,H=c.documentElement,I=!y(c),d&&d!==d.top&&(d.addEventListener?d.addEventListener("u
nload",function(){F()},!1):d.attachEvent&&d.attachEvent("onunload",function(){F()})),v.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),v.getElementsByTagName=e(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),v.getElementsByClassName=rb.test(c.getElementsByClassName)&&e(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),v.getById=e(function(a){return H.appendChild(a).id=N,!c.getElementsByName||!c.getElementsByName(N).length}),v.getById?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&I){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){return a.getAttribute("id")===b}}):(delete w.find.ID,w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b
}}),w.find.TAG=v.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.CLASS=v.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==V&&I?b.getElementsByClassName(a):void 0},K=[],J=[],(v.qsa=rb.test(c.querySelectorAll))&&(e(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&J.push("[*^$]="+db+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||J.push("\\["+db+"*(?:value|"+cb+")"),a.querySelectorAll(":checked").length||J.push(":checked")}),e(function(a){var b=c.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&J.push("name"+db+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||J.push(":enabled",
":disabled"),a.querySelectorAll("*,:x"),J.push(",.*:")})),(v.matchesSelector=rb.test(L=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&e(function(a){v.disconnectedMatch=L.call(a,"div"),L.call(a,"[s!='']:x"),K.push("!=",hb)}),J=J.length&&new RegExp(J.join("|")),K=K.length&&new RegExp(K.join("|")),b=rb.test(H.compareDocumentPosition),M=b||rb.test(H.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=b?function(a,b){if(a===b)return E=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!v.sortDetached&&b.compareDocumentPosition(a)===d?a===c||a.ownerDocument===O&&M(O,a)?-1:b===c||b.ownerDocument===O&&M(O,b)?1
:D?bb.call(D,a)-bb.call(D,b):0:4&d?-1:1)}:function(a,b){if(a===b)return E=!0,0;var d,e=0,f=a.parentNode,h=b.parentNode,i=[a],j=[b];if(!f||!h)return a===c?-1:b===c?1:f?-1:h?1:D?bb.call(D,a)-bb.call(D,b):0;if(f===h)return g(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?g(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},c):G},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if((a.ownerDocument||a)!==G&&F(a),c=c.replace(lb,"='$1']"),!(!v.matchesSelector||!I||K&&K.test(c)||J&&J.test(c)))try{var d=L.call(a,c);if(d||v.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return b(c,G,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!==G&&F(a),M(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!==G&&F(a);var c=w.attrHandle[b.toLowerCase()],d=c&&X.call(w.attrHandle,b.toLowerCase())?c(a,b,!I):void 0;return void 0!==d?d:v.attributes||!I?a.getAttribute(b):(d=a.getAttribut
eNode(b))&&d.specified?d.value:null},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(E=!v.detectDuplicates,D=!v.sortStable&&a.slice(0),a.sort(U),E){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return D=null,a},x=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=x(b);return c},w=b.selectors={cacheLength:50,createPseudo:d,match:ob,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(vb,wb),a[3]=(a[3]||a[4]||a[5]||"").replace(vb,wb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice
(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return ob.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&mb.test(c)&&(b=z(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(vb,wb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=R[a+" "];return b||(b=new RegExp("(^|"+db+")"+a+"("+db+"|$)"))&&R(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:c?(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f+" ").indexOf(d)>-1:"|="===
c?f===d||f.slice(0,d.length+1)===d+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===P&&j[1],m=j[0]===P&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[P,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===P)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[P,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,c){var e,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||b.error("unsuppo
rted pseudo: "+a);return f[N]?f(c):f.length>1?(e=[a,a,"",c],w.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=bb.call(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=A(a.replace(ib,"$1"));return e[N]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:d(function(a){return nb.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(vb,wb).toLowerCase(),function(b){var c;do if(c=I?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},r
oot:function(a){return a===H},focus:function(a){return a===G.activeElement&&(!G.hasFocus||G.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return qb.test(a.nodeName)},input:function(a){return pb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:j(function(){return[0]}),last:j(function(a,b){return[b-1]}),eq:j(function(a,b,c){return[0>c?
c+b:c]}),even:j(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:j(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:j(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:j(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},w.pseudos.nth=w.pseudos.eq;for(u in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[u]=h(u);for(u in{submit:!0,reset:!0})w.pseudos[u]=i(u);return l.prototype=w.filters=w.pseudos,w.setFilters=new l,z=b.tokenize=function(a,c){var d,e,f,g,h,i,j,k=S[a+" "];if(k)return c?0:k.slice(0);for(h=a,i=[],j=w.preFilter;h;){(!d||(e=jb.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),d=!1,(e=kb.exec(h))&&(d=e.shift(),f.push({value:d,type:e[0].replace(ib," ")}),h=h.slice(d.length));for(g in w.filter)!(e=ob[g].exec(h))||j[g]&&!(e=j[g](e))||(d=e.shift(),f.push({value:d,type:g,matches:e}),h=h.slice(d.length));if(!d)break}return c?h.length:h?b.error(a):S(a,i).slice(0)},A=b.compile=function(a,b){var c,d=[],e=[],f=
T[a+" "];if(!f){for(b||(b=z(a)),c=b.length;c--;)f=s(b[c]),f[N]?d.push(f):e.push(f);f=T(a,t(e,d)),f.selector=a}return f},B=b.select=function(a,b,c,d){var e,f,g,h,i,j="function"==typeof a&&a,l=!d&&z(a=j.selector||a);if(c=c||[],1===l.length){if(f=l[0]=l[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&v.getById&&9===b.nodeType&&I&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(vb,wb),b)||[])[0],!b)return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=ob.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(vb,wb),tb.test(f[0].type)&&k(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return _.apply(c,d),c;break}}return(j||A(a,l))(d,b,!I,c,tb.test(a)&&k(b.parentNode)||b),c},v.sortStable=N.split("").sort(U).join("")===N,v.detectDuplicates=!!E,F(),v.sortDetached=e(function(a){return 1&a.compareDocumentPosition(G.createElement("div"))}),e(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firs
tChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),v.attributes&&e(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(cb,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);_.find=eb,_.expr=eb.selectors,_.expr[":"]=_.expr.pseudos,_.unique=eb.uniqueSort,_.text=eb.getText,_.isXMLDoc=eb.isXML,_.contains=eb.contains;var fb=_.expr.match.needsContext,gb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,hb=/^.[^:#\[\.,]*$/;_.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?_.find.matchesSelector(d,a)?[d]:[]:_.find.matches(a,_.grep(b,function(a){return 1===a.nodeType}))},_.fn.extend({find:fu
nction(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(_(a).filter(function(){for(b=0;c>b;b++)if(_.contains(e[b],this))return!0
-}));for(b=0;c>b;b++)_.find(a,e[b],d);return d=this.pushStack(c>1?_.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(d(this,a||[],!1))},not:function(a){return this.pushStack(d(this,a||[],!0))},is:function(a){return!!d(this,"string"==typeof a&&fb.test(a)?_(a):a||[],!1).length}});var ib,jb=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,kb=_.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:jb.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||ib).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof _?b[0]:b,_.merge(this,_.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:Z,!0)),gb.test(c[1])&&_.isPlainObject(b))for(c in b)_.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=Z.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=Z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this)
:_.isFunction(a)?"undefined"!=typeof ib.ready?ib.ready(a):a(_):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),_.makeArray(a,this))};kb.prototype=_.fn,ib=_(Z);var lb=/^(?:parents|prev(?:Until|All))/,mb={children:!0,contents:!0,next:!0,prev:!0};_.extend({dir:function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&_(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),_.fn.extend({has:function(a){var b=_(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(_.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=fb.test(a)||"string"!=typeof a?_(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&_.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?_.unique(f):f)},index:function(a){return a?"string"==type
of a?U.call(_(a),this[0]):U.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(_.unique(_.merge(this.get(),_(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),_.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return _.dir(a,"parentNode")},parentsUntil:function(a,b,c){return _.dir(a,"parentNode",c)},next:function(a){return e(a,"nextSibling")},prev:function(a){return e(a,"previousSibling")},nextAll:function(a){return _.dir(a,"nextSibling")},prevAll:function(a){return _.dir(a,"previousSibling")},nextUntil:function(a,b,c){return _.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return _.dir(a,"previousSibling",c)},siblings:function(a){return _.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return _.sibling(a.firstChild)},contents:function(a){return a.contentDocument||_.merge([],a.childNodes)}},f
unction(a,b){_.fn[a]=function(c,d){var e=_.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=_.filter(d,e)),this.length>1&&(mb[a]||_.unique(e),lb.test(a)&&e.reverse()),this.pushStack(e)}});var nb=/\S+/g,ob={};_.Callbacks=function(a){a="string"==typeof a?ob[a]||f(a):_.extend({},a);var b,c,d,e,g,h,i=[],j=!a.once&&[],k=function(f){for(b=a.memory&&f,c=!0,h=e||0,e=0,g=i.length,d=!0;i&&g>h;h++)if(i[h].apply(f[0],f[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,i&&(j?j.length&&k(j.shift()):b?i=[]:l.disable())},l={add:function(){if(i){var c=i.length;!function f(b){_.each(b,function(b,c){var d=_.type(c);"function"===d?a.unique&&l.has(c)||i.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),d?g=i.length:b&&(e=c,k(b))}return this},remove:function(){return i&&_.each(arguments,function(a,b){for(var c;(c=_.inArray(b,i,c))>-1;)i.splice(c,1),d&&(g>=c&&g--,h>=c&&h--)}),this},has:function(a){return a?_.inArray(a,i)>-1:!(!i||!i.length)},empty:function(){return i=[],g=0,this},disa
ble:function(){return i=j=b=void 0,this},disabled:function(){return!i},lock:function(){return j=void 0,b||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return!i||c&&!j||(b=b||[],b=[a,b.slice?b.slice():b],d?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!c}};return l},_.extend({Deferred:function(a){var b=[["resolve","done",_.Callbacks("once memory"),"resolved"],["reject","fail",_.Callbacks("once memory"),"rejected"],["notify","progress",_.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return _.Deferred(function(c){_.each(b,function(b,f){var g=_.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&_.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:f
unction(a){return null!=a?_.extend(a,d):d}},e={};return d.pipe=d.then,_.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b,c,d,e=0,f=R.call(arguments),g=f.length,h=1!==g||a&&_.isFunction(a.promise)?g:0,i=1===h?a:_.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?R.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);g>e;e++)f[e]&&_.isFunction(f[e].promise)?f[e].promise().done(j(e,d,f)).fail(i.reject).progress(j(e,c,b)):--h;return h||i.resolveWith(d,f),i.promise()}});var pb;_.fn.ready=function(a){return _.ready.promise().done(a),this},_.extend({isReady:!1,readyWait:1,holdReady:function(a){a?_.readyWait++:_.ready(!0)},ready:function(a){(a===!0?--_.readyWait:_.isReady)||(_
.isReady=!0,a!==!0&&--_.readyWait>0||(pb.resolveWith(Z,[_]),_.fn.triggerHandler&&(_(Z).triggerHandler("ready"),_(Z).off("ready"))))}}),_.ready.promise=function(b){return pb||(pb=_.Deferred(),"complete"===Z.readyState?setTimeout(_.ready):(Z.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1))),pb.promise(b)},_.ready.promise();var qb=_.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===_.type(c)){e=!0;for(h in c)_.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,_.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(_(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};_.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType},h.uid=1,h.accepts=_.acceptData,h.prototype={key:function(a){if(!h.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=h.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=
c,_.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(_.isEmptyObject(f))_.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,_.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{_.isArray(b)?d=b.concat(b.map(_.camelCase)):(e=_.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(nb)||[])),c=d.length;for(;c--;)delete g[d[c]]}},hasData:function(a){return!_.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var rb=new h,sb=new h,tb=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ub=/([A-Z])/g;_.extend({hasData:function(a){return sb.hasD
ata(a)||rb.hasData(a)},data:function(a,b,c){return sb.access(a,b,c)},removeData:function(a,b){sb.remove(a,b)},_data:function(a,b,c){return rb.access(a,b,c)},_removeData:function(a,b){rb.remove(a,b)}}),_.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=sb.get(f),1===f.nodeType&&!rb.get(f,"hasDataAttrs"))){for(c=g.length;c--;)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=_.camelCase(d.slice(5)),i(f,d,e[d])));rb.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){sb.set(this,a)}):qb(this,function(b){var c,d=_.camelCase(a);if(f&&void 0===b){if(c=sb.get(f,a),void 0!==c)return c;if(c=sb.get(f,d),void 0!==c)return c;if(c=i(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=sb.get(this,d);sb.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&sb.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){sb.remove(this,a)})}}),_.extend({queue:function(a,b,c){v
ar d;return a?(b=(b||"fx")+"queue",d=rb.get(a,b),c&&(!d||_.isArray(c)?d=rb.access(a,b,_.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=_.queue(a,b),d=c.length,e=c.shift(),f=_._queueHooks(a,b),g=function(){_.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return rb.get(a,c)||rb.access(a,c,{empty:_.Callbacks("once memory").add(function(){rb.remove(a,[b+"queue",c])})})}}),_.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?_.queue(this[0],a):void 0===b?this:this.each(function(){var c=_.queue(this,a,b);_._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&_.dequeue(this,a)})},dequeue:function(a){return this.each(function(){_.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=_.Deferred(),f=this,g=this.length,h=funct
ion(){--d||e.resolveWith(f,[f])};for("string"!=typeof a&&(b=a,a=void 0),a=a||"fx";g--;)c=rb.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var vb=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,wb=["Top","Right","Bottom","Left"],xb=function(a,b){return a=b||a,"none"===_.css(a,"display")||!_.contains(a.ownerDocument,a)},yb=/^(?:checkbox|radio)$/i;!function(){var a=Z.createDocumentFragment(),b=a.appendChild(Z.createElement("div")),c=Z.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),Y.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",Y.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var zb="undefined";Y.focusinBubbles="onfocusin"in a;var Ab=/^key/,Bb=/^(?:mouse|pointer|contextmenu)|click/,Cb=/^(?:focusinfocus|focusoutblur)$/,Db=/^([^.]*)(?:\.(.+)|)$/;_.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,
m,n,o,p,q=rb.get(a);if(q)for(c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=_.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return typeof _!==zb&&_.event.triggered!==b.type?_.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(nb)||[""],j=b.length;j--;)h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=_.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=_.event.special[n]||{},k=_.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&_.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),_.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=rb.hasData(a)&&rb.get(a);if(q&&(i=q.events)){for(b=(b||"").match(nb)||[""],j=b.length;j--;
)if(h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=_.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||_.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)_.event.remove(a,n+b[j],c,d,!0);_.isEmptyObject(i)&&(delete q.handle,rb.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m=[d||Z],n=X.call(b,"type")?b.type:b,o=X.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||Z,3!==d.nodeType&&8!==d.nodeType&&!Cb.test(n+_.event.triggered)&&(n.indexOf(".")>=0&&(o=n.split("."),n=o.shift(),o.sort()),j=n.indexOf(":")<0&&"on"+n,b=b[_.expando]?b:new _.Event(n,"object"==typeof b&&b),b.isTrigger=e?2:3,b.n
amespace=o.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:_.makeArray(c,[b]),l=_.event.special[n]||{},e||!l.trigger||l.trigger.apply(d,c)!==!1)){if(!e&&!l.noBubble&&!_.isWindow(d)){for(i=l.delegateType||n,Cb.test(i+n)||(g=g.parentNode);g;g=g.parentNode)m.push(g),h=g;h===(d.ownerDocument||Z)&&m.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=m[f++])&&!b.isPropagationStopped();)b.type=f>1?i:l.bindType||n,k=(rb.get(g,"events")||{})[b.type]&&rb.get(g,"handle"),k&&k.apply(g,c),k=j&&g[j],k&&k.apply&&_.acceptData(g)&&(b.result=k.apply(g,c),b.result===!1&&b.preventDefault());return b.type=n,e||b.isDefaultPrevented()||l._default&&l._default.apply(m.pop(),c)!==!1||!_.acceptData(d)||j&&_.isFunction(d[n])&&!_.isWindow(d)&&(h=d[j],h&&(d[j]=null),_.event.triggered=n,d[n](),_.event.triggered=void 0,h&&(d[j]=h)),b.result}},dispatch:function(a){a=_.event.fix(a);var b,c,d,e,f,g=[],h=R.call(argume
nts),i=(rb.get(this,"events")||{})[a.type]||[],j=_.event.special[a.type]||{};if(h[0]=a,a.delegateTarget=this,!j.preDispatch||j.preDispatch.call(this,a)!==!1){for(g=_.event.handlers.call(this,a,i),b=0;(e=g[b++])&&!a.isPropagationStopped();)for(a.currentTarget=e.elem,c=0;(f=e.handlers[c++])&&!a.isImmediatePropagationStopped();)(!a.namespace_re||a.namespace_re.test(f.namespace))&&(a.handleObj=f,a.data=f.data,d=((_.event.special[f.origType]||{}).handle||f.handler).apply(e.elem,h),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return j.postDispatch&&j.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?_(e,this).index(i)>=0:_.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}re
turn h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||Z,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[_.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];for(g||(this.fixHooks[e]=g=Bb.test(e)?this.mouseHooks:Ab.tes
t(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new _.Event(f),b=d.length;b--;)c=d[b],a[c]=f[c];return a.target||(a.target=Z),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==l()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===l()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&_.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return _.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=_.extend(new _.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?_.event.trigger(e,null,b):_.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},_.removeEvent=function(a,b,c){a.removeE
ventListener&&a.removeEventListener(b,c,!1)},_.Event=function(a,b){return this instanceof _.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?j:k):this.type=a,b&&_.extend(this,b),this.timeStamp=a&&a.timeStamp||_.now(),void(this[_.expando]=!0)):new _.Event(a,b)},_.Event.prototype={isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=j,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=j,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=j,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},_.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,
b){_.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!_.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),Y.focusinBubbles||_.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){_.event.simulate(b,a.target,_.event.fix(a),!0)};_.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=rb.access(d,b);e||d.addEventListener(a,c,!0),rb.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=rb.access(d,b)-1;e?rb.access(d,b,e):(d.removeEventListener(a,c,!0),rb.remove(d,b))}}}),_.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=k;else if(!d)return this;return 1===e&&(f=d,d=function(a){return _().off(a),f.apply(this,arguments)
},d.guid=f.guid||(f.guid=_.guid++)),this.each(function(){_.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,_(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=k),this.each(function(){_.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){_.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?_.event.trigger(a,b,c,!0):void 0}});var Eb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Fb=/<([\w:]+)/,Gb=/<|&#?\w+;/,Hb=/<(?:script|style|link)/i,Ib=/checked\s*(?:[^=]|=\s*.checked.)/i,Jb=/^$|\/(?:java|ecma)script/i,Kb=/^true\/(.*)/,Lb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Mb={option:[1,"<select multiple='multiple'>","</selec
t>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Mb.optgroup=Mb.option,Mb.tbody=Mb.tfoot=Mb.colgroup=Mb.caption=Mb.thead,Mb.th=Mb.td,_.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=_.contains(a.ownerDocument,a);if(!(Y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||_.isXMLDoc(a)))for(g=r(h),f=r(a),d=0,e=f.length;e>d;d++)s(f[d],g[d]);if(b)if(c)for(f=f||r(a),g=g||r(h),d=0,e=f.length;e>d;d++)q(f[d],g[d]);else q(a,h);return g=r(h,"script"),g.length>0&&p(g,!i&&r(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===_.type(e))_.merge(l,e.nodeType?[e]:e);else if(Gb.test(e)){for(f=f||k.appendChild(b.createElement("div")),g=(Fb.exec(e)||["",""])[1].toLowerCase(),h=Mb[g]||Mb._default,f.innerHTML=h[1]+e.replace(Eb,"<$1></$2>"
)+h[2],j=h[0];j--;)f=f.lastChild;_.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));for(k.textContent="",m=0;e=l[m++];)if((!d||-1===_.inArray(e,d))&&(i=_.contains(e.ownerDocument,e),f=r(k.appendChild(e),"script"),i&&p(f),c))for(j=0;e=f[j++];)Jb.test(e.type||"")&&c.push(e);return k},cleanData:function(a){for(var b,c,d,e,f=_.event.special,g=0;void 0!==(c=a[g]);g++){if(_.acceptData(c)&&(e=c[rb.expando],e&&(b=rb.cache[e]))){if(b.events)for(d in b.events)f[d]?_.event.remove(c,d):_.removeEvent(c,d,b.handle);rb.cache[e]&&delete rb.cache[e]}delete sb.cache[c[sb.expando]]}}}),_.fn.extend({text:function(a){return qb(this,function(a){return void 0===a?_.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.appendChild(a)}})}
,prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?_.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||_.cleanData(r(c)),c.parentNode&&(b&&_.contains(c.ownerDocument,c)&&p(r(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(_.cleanData(r(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return _.clone(this,a,b)})},html:function(a){return qb(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.inner
HTML;if("string"==typeof a&&!Hb.test(a)&&!Mb[(Fb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Eb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(_.cleanData(r(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,_.cleanData(r(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=S.apply([],a);var c,d,e,f,g,h,i=0,j=this.length,k=this,l=j-1,m=a[0],p=_.isFunction(m);if(p||j>1&&"string"==typeof m&&!Y.checkClone&&Ib.test(m))return this.each(function(c){var d=k.eq(c);p&&(a[0]=m.call(this,c,d.html())),d.domManip(a,b)});if(j&&(c=_.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(e=_.map(r(c,"script"),n),f=e.length;j>i;i++)g=c,i!==l&&(g=_.clone(g,!0,!0),f&&_.merge(e,r(g,"script"))),b.call(th
is[i],g,i);if(f)for(h=e[e.length-1].ownerDocument,_.map(e,o),i=0;f>i;i++)g=e[i],Jb.test(g.type||"")&&!rb.access(g,"globalEval")&&_.contains(h,g)&&(g.src?_._evalUrl&&_._evalUrl(g.src):_.globalEval(g.textContent.replace(Lb,"")))}return this}}),_.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){_.fn[a]=function(a){for(var c,d=[],e=_(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),_(e[g])[b](c),T.apply(d,c.get());return this.pushStack(d)}});var Nb,Ob={},Pb=/^margin/,Qb=new RegExp("^("+vb+")(?!px)[a-z%]+$","i"),Rb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};!function(){function b(){g.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",g.innerHTML="",e.appendChild(f);var b=a.getComputedStyle(g,null);c="1%"!==b.top,d="4px"===b.width,e.removeChild(f)}
var c,d,e=Z.documentElement,f=Z.createElement("div"),g=Z.createElement("div");g.style&&(g.style.backgroundClip="content-box",g.cloneNode(!0).style.backgroundClip="",Y.clearCloneStyle="content-box"===g.style.backgroundClip,f.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",f.appendChild(g),a.getComputedStyle&&_.extend(Y,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return null==d&&b(),d},reliableMarginRight:function(){var b,c=g.appendChild(Z.createElement("div"));return c.style.cssText=g.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",g.style.width="1px",e.appendChild(f),b=!parseFloat(a.getComputedStyle(c,null).marginRight),e.removeChild(f),b}}))}(),_.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var S
b=/^(none|table(?!-c[ea]).+)/,Tb=new RegExp("^("+vb+")(.*)$","i"),Ub=new RegExp("^([+-])=("+vb+")","i"),Vb={position:"absolute",visibility:"hidden",display:"block"},Wb={letterSpacing:"0",fontWeight:"400"},Xb=["Webkit","O","Moz","ms"];_.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=v(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=_.camelCase(b),i=a.style;return b=_.cssProps[h]||(_.cssProps[h]=x(i,h)),g=_.cssHooks[b]||_.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ub.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(_.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||_.cssNumber[h]||(c+="px"),Y.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g
&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=_.camelCase(b);return b=_.cssProps[h]||(_.cssProps[h]=x(a.style,h)),g=_.cssHooks[b]||_.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=v(a,b,d)),"normal"===e&&b in Wb&&(e=Wb[b]),""===c||c?(f=parseFloat(e),c===!0||_.isNumeric(f)?f||0:e):e}}),_.each(["height","width"],function(a,b){_.cssHooks[b]={get:function(a,c,d){return c?Sb.test(_.css(a,"display"))&&0===a.offsetWidth?_.swap(a,Vb,function(){return A(a,b,d)}):A(a,b,d):void 0},set:function(a,c,d){var e=d&&Rb(a);return y(a,c,d?z(a,b,d,"border-box"===_.css(a,"boxSizing",!1,e),e):0)}}}),_.cssHooks.marginRight=w(Y.reliableMarginRight,function(a,b){return b?_.swap(a,{display:"inline-block"},v,[a,"marginRight"]):void 0}),_.each({margin:"",padding:"",border:"Width"},function(a,b){_.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+wb[d]+b]=f[d]||f[d-2]||f[0];return e}},Pb.test(a)||(_.cssHooks[a+b].
set=y)}),_.fn.extend({css:function(a,b){return qb(this,function(a,b,c){var d,e,f={},g=0;if(_.isArray(b)){for(d=Rb(a),e=b.length;e>g;g++)f[b[g]]=_.css(a,b[g],!1,d);return f}return void 0!==c?_.style(a,b,c):_.css(a,b)},a,b,arguments.length>1)},show:function(){return B(this,!0)},hide:function(){return B(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){xb(this)?_(this).show():_(this).hide()})}}),_.Tween=C,C.prototype={constructor:C,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(_.cssNumber[c]?"":"px")},cur:function(){var a=C.propHooks[this.prop];return a&&a.get?a.get(this):C.propHooks._default.get(this)},run:function(a){var b,c=C.propHooks[this.prop];return this.pos=b=this.options.duration?_.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.s
tep.call(this.elem,this.now,this),c&&c.set?c.set(this):C.propHooks._default.set(this),this}},C.prototype.init.prototype=C.prototype,C.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=_.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){_.fx.step[a.prop]?_.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[_.cssProps[a.prop]]||_.cssHooks[a.prop])?_.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},C.propHooks.scrollTop=C.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},_.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},_.fx=C.prototype.init,_.fx.step={};var Yb,Zb,$b=/^(?:toggle|show|hide)$/,_b=new RegExp("^(?:([+-])=|)("+vb+")([a-z%]*)$","i"),ac=/queueHooks$/,bc=[G],cc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=_b.exec(b),f=e&&e[3]||(_.cssNumber[a]?"":"px"),g=(_.cssNumber[a]||"px"!=
=f&&+d)&&_b.exec(_.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,_.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};_.Animation=_.extend(I,{tweener:function(a,b){_.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],cc[c]=cc[c]||[],cc[c].unshift(b)},prefilter:function(a,b){b?bc.unshift(a):bc.push(a)}}),_.speed=function(a,b,c){var d=a&&"object"==typeof a?_.extend({},a):{complete:c||!c&&b||_.isFunction(a)&&a,duration:a,easing:c&&b||b&&!_.isFunction(b)&&b};return d.duration=_.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in _.fx.speeds?_.fx.speeds[d.duration]:_.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){_.isFunction(d.old)&&d.old.call(this),d.queue&&_.dequeue(this,d.queue)},d},_.fn.extend({fadeTo:function(a,b,c,d){return this.filter(xb).css("opacity",0).show()
.end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=_.isEmptyObject(a),f=_.speed(b,c,d),g=function(){var b=I(this,_.extend({},a),f);(e||rb.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=_.timers,g=rb.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ac.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&_.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=rb.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=_.timers,g=d?d.length:0;for(c.finish=!0,_.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.spli
ce(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),_.each(["toggle","show","hide"],function(a,b){var c=_.fn[b];
-_.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(E(b,!0),a,d,e)}}),_.each({slideDown:E("show"),slideUp:E("hide"),slideToggle:E("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){_.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),_.timers=[],_.fx.tick=function(){var a,b=0,c=_.timers;for(Yb=_.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||_.fx.stop(),Yb=void 0},_.fx.timer=function(a){_.timers.push(a),a()?_.fx.start():_.timers.pop()},_.fx.interval=13,_.fx.start=function(){Zb||(Zb=setInterval(_.fx.tick,_.fx.interval))},_.fx.stop=function(){clearInterval(Zb),Zb=null},_.fx.speeds={slow:600,fast:200,_default:400},_.fn.delay=function(a,b){return a=_.fx?_.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=Z.createElement("input"),b=Z.createElement("select"),c=b.appendChild(Z.createEleme
nt("option"));a.type="checkbox",Y.checkOn=""!==a.value,Y.optSelected=c.selected,b.disabled=!0,Y.optDisabled=!c.disabled,a=Z.createElement("input"),a.value="t",a.type="radio",Y.radioValue="t"===a.value}();var dc,ec,fc=_.expr.attrHandle;_.fn.extend({attr:function(a,b){return qb(this,_.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){_.removeAttr(this,a)})}}),_.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===zb?_.prop(a,b,c):(1===f&&_.isXMLDoc(a)||(b=b.toLowerCase(),d=_.attrHooks[b]||(_.expr.match.bool.test(b)?ec:dc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=_.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void _.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(nb);if(f&&1===a.nodeType)for(;c=f[e++];)d=_.propFix[c]||c,_.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:functio
n(a,b){if(!Y.radioValue&&"radio"===b&&_.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),ec={set:function(a,b,c){return b===!1?_.removeAttr(a,c):a.setAttribute(c,c),c}},_.each(_.expr.match.bool.source.match(/\w+/g),function(a,b){var c=fc[b]||_.find.attr;fc[b]=function(a,b,d){var e,f;return d||(f=fc[b],fc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,fc[b]=f),e}});var gc=/^(?:input|select|textarea|button)$/i;_.fn.extend({prop:function(a,b){return qb(this,_.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[_.propFix[a]||a]})}}),_.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!_.isXMLDoc(a),f&&(b=_.propFix[b]||b,e=_.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||gc.test(a.n
odeName)||a.href?a.tabIndex:-1}}}}),Y.optSelected||(_.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),_.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){_.propFix[this.toLowerCase()]=this});var hc=/[\t\r\n\f]/g;_.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):" ")){for(f=0;e=b[f++];)d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=_.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).removeClass(a.call(this,b,this.classNa
me))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):"")){for(f=0;e=b[f++];)for(;d.indexOf(" "+e+" ")>=0;)d=d.replace(" "+e+" "," ");g=a?_.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(_.isFunction(a)?function(c){_(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c)for(var b,d=0,e=_(this),f=a.match(nb)||[];b=f[d++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else(c===zb||"boolean"===c)&&(this.className&&rb.set(this,"__className__",this.className),this.className=this.className||a===!1?"":rb.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(hc," ").indexOf(b)>=0)return!0;return!1}});var ic=/\r/g;_.fn.extend({val:function(a){var b
,c,d,e=this[0];{if(arguments.length)return d=_.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,_(this).val()):a,null==e?e="":"number"==typeof e?e+="":_.isArray(e)&&(e=_.map(e,function(a){return null==a?"":a+""})),b=_.valHooks[this.type]||_.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=_.valHooks[e.type]||_.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ic,""):null==c?"":c)}}}),_.extend({valHooks:{option:{get:function(a){var b=_.find.attr(a,"value");return null!=b?b:_.trim(_.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(Y.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&_.nodeName(c.parentNode,"optgroup"))){if(b=_(c).val(),f)return b;g.p
ush(b)}return g},set:function(a,b){for(var c,d,e=a.options,f=_.makeArray(b),g=e.length;g--;)d=e[g],(d.selected=_.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),_.each(["radio","checkbox"],function(){_.valHooks[this]={set:function(a,b){return _.isArray(b)?a.checked=_.inArray(_(a).val(),b)>=0:void 0}},Y.checkOn||(_.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),_.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){_.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),_.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){
return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var jc=_.now(),kc=/\?/;_.parseJSON=function(a){return JSON.parse(a+"")},_.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&_.error("Invalid XML: "+a),b};var lc,mc,nc=/#.*$/,oc=/([?&])_=[^&]*/,pc=/^(.*?):[ \t]*([^\r\n]*)$/gm,qc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rc=/^(?:GET|HEAD)$/,sc=/^\/\//,tc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,uc={},vc={},wc="*/".concat("*");try{mc=location.href}catch(xc){mc=Z.createElement("a"),mc.href="",mc=mc.href}lc=tc.exec(mc.toLowerCase())||[],_.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:mc,type:"GET",isLocal:qc.test(lc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":wc,text:"text/plain",html:"text/html",xml:"appli
cation/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":_.parseJSON,"text xml":_.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?L(L(a,_.ajaxSettings),b):L(_.ajaxSettings,a)},ajaxPrefilter:J(uc),ajaxTransport:J(vc),ajax:function(a,b){function c(a,b,c,g){var i,k,r,s,u,w=b;2!==t&&(t=2,h&&clearTimeout(h),d=void 0,f=g||"",v.readyState=a>0?4:0,i=a>=200&&300>a||304===a,c&&(s=M(l,v,c)),s=N(l,s,v,i),i?(l.ifModified&&(u=v.getResponseHeader("Last-Modified"),u&&(_.lastModified[e]=u),u=v.getResponseHeader("etag"),u&&(_.etag[e]=u)),204===a||"HEAD"===l.type?w="nocontent":304===a?w="notmodified":(w=s.state,k=s.data,r=s.error,i=!r)):(r=w,(a||!w)&&(w="error",0>a&&(a=0))),v.status=a,v.statusText=(b||w)+"",i?o.resolveWith(m,[k,w,v]):o.rejectWith(m,[v,w,r]),v.statusCode(q),q=void 0,j&&n.trigger(
i?"ajaxSuccess":"ajaxError",[v,l,i?k:r]),p.fireWith(m,[v,w]),j&&(n.trigger("ajaxComplete",[v,l]),--_.active||_.event.trigger("ajaxStop")))}"object"==typeof a&&(b=a,a=void 0),b=b||{};var d,e,f,g,h,i,j,k,l=_.ajaxSetup({},b),m=l.context||l,n=l.context&&(m.nodeType||m.jquery)?_(m):_.event,o=_.Deferred(),p=_.Callbacks("once memory"),q=l.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!g)for(g={};b=pc.exec(f);)g[b[1].toLowerCase()]=b[2];b=g[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return d&&d.abort(b),c(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,l.url=((a||l.url
||mc)+"").replace(nc,"").replace(sc,lc[1]+"//"),l.type=b.method||b.type||l.method||l.type,l.dataTypes=_.trim(l.dataType||"*").toLowerCase().match(nb)||[""],null==l.crossDomain&&(i=tc.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]===lc[1]&&i[2]===lc[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(lc[3]||("http:"===lc[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=_.param(l.data,l.traditional)),K(uc,l,b,v),2===t)return v;j=l.global,j&&0===_.active++&&_.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!rc.test(l.type),e=l.url,l.hasContent||(l.data&&(e=l.url+=(kc.test(e)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=oc.test(e)?e.replace(oc,"$1_="+jc++):e+(kc.test(e)?"&":"?")+"_="+jc++)),l.ifModified&&(_.lastModified[e]&&v.setRequestHeader("If-Modified-Since",_.lastModified[e]),_.etag[e]&&v.setRequestHeader("If-None-Match",_.etag[e])),(l.data&&l.hasContent&&l.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",l.contentTy
pe),v.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+wc+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)v.setRequestHeader(k,l.headers[k]);if(l.beforeSend&&(l.beforeSend.call(m,v,l)===!1||2===t))return v.abort();u="abort";for(k in{success:1,error:1,complete:1})v[k](l[k]);if(d=K(vc,l,b,v)){v.readyState=1,j&&n.trigger("ajaxSend",[v,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){v.abort("timeout")},l.timeout));try{t=1,d.send(r,c)}catch(w){if(!(2>t))throw w;c(-1,w)}}else c(-1,"No Transport");return v},getJSON:function(a,b,c){return _.get(a,b,c,"json")},getScript:function(a,b){return _.get(a,void 0,b,"script")}}),_.each(["get","post"],function(a,b){_[b]=function(a,c,d,e){return _.isFunction(c)&&(e=e||d,d=c,c=void 0),_.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){_.fn[b]=function(a){return this.on(b,a)}}),_
._evalUrl=function(a){return _.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},_.fn.extend({wrapAll:function(a){var b;return _.isFunction(a)?this.each(function(b){_(this).wrapAll(a.call(this,b))}):(this[0]&&(b=_(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(_.isFunction(a)?function(b){_(this).wrapInner(a.call(this,b))}:function(){var b=_(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=_.isFunction(a);return this.each(function(c){_(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){_.nodeName(this,"body")||_(this).replaceWith(this.childNodes)}).end()}}),_.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},_.expr.filters.visible=function(a){return!_.expr.filters.hidden(a)};var yc
=/%20/g,zc=/\[\]$/,Ac=/\r?\n/g,Bc=/^(?:submit|button|image|reset|file)$/i,Cc=/^(?:input|select|textarea|keygen)/i;_.param=function(a,b){var c,d=[],e=function(a,b){b=_.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=_.ajaxSettings&&_.ajaxSettings.traditional),_.isArray(a)||a.jquery&&!_.isPlainObject(a))_.each(a,function(){e(this.name,this.value)});else for(c in a)O(c,a[c],b,e);return d.join("&").replace(yc,"+")},_.fn.extend({serialize:function(){return _.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=_.prop(this,"elements");return a?_.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!_(this).is(":disabled")&&Cc.test(this.nodeName)&&!Bc.test(a)&&(this.checked||!yb.test(a))}).map(function(a,b){var c=_(this).val();return null==c?null:_.isArray(c)?_.map(c,function(a){return{name:b.name,value:a.replace(Ac,"\r\n")}}):{name:b.name,value:c.replace(Ac,"\r\n")}}).get()
}}),_.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Dc=0,Ec={},Fc={0:200,1223:204},Gc=_.ajaxSettings.xhr();a.ActiveXObject&&_(a).on("unload",function(){for(var a in Ec)Ec[a]()}),Y.cors=!!Gc&&"withCredentials"in Gc,Y.ajax=Gc=!!Gc,_.ajaxTransport(function(a){var b;return Y.cors||Gc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Dc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Ec[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Fc[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Ec[g]=b("abort");try{f.send(a.hasContent&&a
.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),_.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return _.globalEval(a),a}}}),_.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),_.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=_("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),Z.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Hc=[],Ic=/(=)\?(?=&|$)|\?\?/;_.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Hc.pop()||_.expando+"_"+jc++;return this[a]=!0,a}}),_.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ic.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("app
lication/x-www-form-urlencoded")&&Ic.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=_.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ic,"$1"+e):b.jsonp!==!1&&(b.url+=(kc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||_.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Hc.push(e)),g&&_.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),_.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||Z;var d=gb.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=_.buildFragment([a],b,e),e&&e.length&&_(e).remove(),_.merge([],d.childNodes))};var Jc=_.fn.load;_.fn.load=function(a,b,c){if("string"!=typeof a&&Jc)return Jc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=_.trim(a.slice(h)),a=a.slice(0,h)),_.isFunction(b)
?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&_.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?_("<div>").append(_.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},_.expr.filters.animated=function(a){return _.grep(_.timers,function(b){return a===b.elem}).length};var Kc=a.document.documentElement;_.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=_.css(a,"position"),l=_(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=_.css(a,"top"),i=_.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),_.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},_.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){_.offset.setOffset(this,a,b)});var b,c,d=t
his[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,_.contains(b,d)?(typeof d.getBoundingClientRect!==zb&&(e=d.getBoundingClientRect()),c=P(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===_.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),_.nodeName(a[0],"html")||(d=a.offset()),d.top+=_.css(a[0],"borderTopWidth",!0),d.left+=_.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-_.css(c,"marginTop",!0),left:b.left-d.left-_.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||Kc;a&&!_.nodeName(a,"html")&&"static"===_.css(a,"position");)a=a.offsetParent;return a||Kc})}}),_.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;_.fn[b]=function(e){return qb(this,function(b,e,f){var g=P(b);return void 0===f?g?g[c]:b[e]:void(
g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),_.each(["top","left"],function(a,b){_.cssHooks[b]=w(Y.pixelPosition,function(a,c){return c?(c=v(a,b),Qb.test(c)?_(a).position()[b]+"px":c):void 0})}),_.each({Height:"height",Width:"width"},function(a,b){_.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){_.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return qb(this,function(b,c,d){var e;return _.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?_.css(b,c,g):_.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),_.fn.size=function(){return this.length},_.fn.andSelf=_.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return _});var Lc=a.jQuery,Mc=a.$;return _.noConflict=function(b){return a.$===_&&(a.$=Mc),b&&a.jQuery
===_&&(a.jQuery=Lc),_},typeof b===zb&&(a.jQuery=a.$=_),_}),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.len
gth||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)
):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$elemen
t=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){
return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass
<TRUNCATED>
[27/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.ttf
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.ttf b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..5cd6cff
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.ttf differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.woff
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.woff b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..9eaecb3
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.woff differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/images/maze-black.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/images/maze-black.png b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/images/maze-black.png
new file mode 100644
index 0000000..99a49c2
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/images/maze-black.png differ
[58/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
ISIS-789: removing neoapp example after all
... decided would live better in isisaddons
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/9679840c
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/9679840c
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/9679840c
Branch: refs/heads/ISIS-789
Commit: 9679840c508c1efb232060e9ec78083fc2c0ab4b
Parents: fa30a76
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Mar 30 15:51:07 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Mar 30 15:51:07 2015 +0100
----------------------------------------------------------------------
core/applib/pom.xml | 2 +-
core/integtestsupport/pom.xml | 2 +-
core/log4j/pom.xml | 2 +-
core/maven-plugin/pom.xml | 2 +-
core/metamodel/pom.xml | 2 +-
core/pom.xml | 60 +-
core/runtime/pom.xml | 2 +-
core/security-noop/pom.xml | 2 +-
core/security-shiro/pom.xml | 6 +-
core/specsupport/pom.xml | 2 +-
core/unittestsupport/pom.xml | 2 +-
core/viewer-restfulobjects-applib/pom.xml | 2 +-
core/viewer-restfulobjects-rendering/pom.xml | 2 +-
core/viewer-restfulobjects-server/pom.xml | 2 +-
core/viewer-wicket/applib/pom.xml | 2 +-
core/viewer-wicket/impl/pom.xml | 2 +-
core/viewer-wicket/model/pom.xml | 2 +-
core/viewer-wicket/pom.xml | 2 +-
core/viewer-wicket/ui/pom.xml | 2 +-
core/webserver/pom.xml | 2 +-
core/wrapper/pom.xml | 2 +-
example/application/neoapp/dom/.gitignore | 2 -
example/application/neoapp/dom/log4j.properties | 41 -
example/application/neoapp/dom/pom.xml | 162 -
.../dom/src/main/java/META-INF/persistence.xml | 26 -
.../dom/src/main/java/dom/simple/ARecord.java | 70 -
.../dom/src/main/java/dom/simple/Host.java | 61 -
.../dom/src/main/java/dom/simple/Hosts.java | 29 -
.../dom/src/main/java/dom/simple/IpAddress.java | 54 -
.../src/main/java/dom/simple/SimpleObject.java | 101 -
.../java/dom/simple/SimpleObject.layout.json | 44 -
.../src/main/java/dom/simple/SimpleObject.png | Bin 557 -> 0 bytes
.../src/main/java/dom/simple/SimpleObjects.java | 63 -
.../test/java/dom/simple/SimpleObjectTest.java | 51 -
.../test/java/dom/simple/SimpleObjectsTest.java | 102 -
example/application/neoapp/fixture/.gitignore | 2 -
example/application/neoapp/fixture/pom.xml | 38 -
.../simple/SimpleObjectsFixturesService.java | 69 -
.../simple/SimpleObjectsTearDownFixture.java | 36 -
.../simple/objects/SimpleObjectAbstract.java | 36 -
.../simple/objects/SimpleObjectForBar.java | 31 -
.../simple/objects/SimpleObjectForBaz.java | 31 -
.../simple/objects/SimpleObjectForFoo.java | 31 -
.../simple/scenario/SimpleObjectsFixture.java | 45 -
.../application/neoapp/integtests/.gitignore | 3 -
.../neoapp/integtests/logging.properties | 103 -
example/application/neoapp/integtests/pom.xml | 122 -
.../integration/SimpleAppSystemInitializer.java | 72 -
.../integration/glue/BootstrappingGlue.java | 53 -
.../integration/glue/CatalogOfFixturesGlue.java | 46 -
.../glue/InMemoryDBForSimpleApp.java | 40 -
.../glue/simple/SimpleObjectGlue.java | 96 -
.../java/integration/specs/simple/RunSpecs.java | 38 -
.../SimpleObjectSpec_listAllAndCreate.feature | 37 -
.../integration/tests/SimpleAppIntegTest.java | 38 -
.../tests/smoke/SimpleObjectTest.java | 82 -
.../tests/smoke/SimpleObjectsTest.java | 148 -
example/application/neoapp/pom.xml | 373 --
example/application/neoapp/webapp/.gitignore | 4 -
.../launch/SimpleApp-PROTOTYPE-jrebel.launch | 30 -
.../SimpleApp-PROTOTYPE-no-fixtures.launch | 22 -
.../SimpleApp-PROTOTYPE-with-fixtures.launch | 19 -
.../launch/SimpleApp-SERVER-no-fixtures.launch | 47 -
.../webapp/ide/intellij/launch/README.txt | 2 -
.../ide/intellij/launch/SimpleApp_PROTOTYPE.xml | 28 -
.../launch/SimpleApp__enhance_only_.xml | 22 -
.../application/neoapp/webapp/lib/.gitignore | 5 -
example/application/neoapp/webapp/pom.xml | 350 --
.../src/main/java/webapp/SimpleApplication.java | 149 -
.../src/main/jettyconsole/isis-banner.pdn | Bin 69658 -> 0 bytes
.../src/main/jettyconsole/isis-banner.png | Bin 30776 -> 0 bytes
.../src/main/resources/webapp/welcome.html | 35 -
.../src/main/webapp/WEB-INF/isis.properties | 233 -
.../src/main/webapp/WEB-INF/logging.properties | 185 -
.../main/webapp/WEB-INF/persistor.properties | 124 -
.../WEB-INF/persistor_datanucleus.properties | 104 -
.../webapp/src/main/webapp/WEB-INF/shiro.ini | 93 -
.../WEB-INF/viewer_restfulobjects.properties | 66 -
.../webapp/WEB-INF/viewer_wicket.properties | 84 -
.../webapp/src/main/webapp/WEB-INF/web.xml | 309 -
.../src/main/webapp/about/images/isis-logo.png | Bin 14160 -> 0 bytes
.../webapp/src/main/webapp/about/index.html | 114 -
.../webapp/src/main/webapp/css/application.css | 19 -
.../webapp/src/main/webapp/cy2neo/bower.json | 31 -
.../webapp/src/main/webapp/cy2neo/index.html | 135 -
.../main/webapp/cy2neo/scripts/alchemyConfig.js | 33 -
.../webapp/cy2neo/scripts/codemirror-cypher.js | 190 -
.../main/webapp/cy2neo/scripts/codemirror.js | 5909 ------------------
.../src/main/webapp/cy2neo/scripts/cy2neo.js | 4 -
.../src/main/webapp/cy2neo/scripts/data.js | 766 ---
.../src/main/webapp/cy2neo/scripts/neo.js | 73 -
.../src/main/webapp/cy2neo/scripts/vendor.js | 10 -
.../webapp/cy2neo/styles/codemirror-neo.css | 25 -
.../main/webapp/cy2neo/styles/codemirror.css | 263 -
.../src/main/webapp/cy2neo/styles/cy2neo.css | 21 -
.../webapp/cy2neo/styles/fonts/FontAwesome.otf | Bin 75188 -> 0 bytes
.../cy2neo/styles/fonts/fontawesome-webfont.eot | Bin 72449 -> 0 bytes
.../cy2neo/styles/fonts/fontawesome-webfont.svg | 504 --
.../cy2neo/styles/fonts/fontawesome-webfont.ttf | Bin 141564 -> 0 bytes
.../styles/fonts/fontawesome-webfont.woff | Bin 83760 -> 0 bytes
.../webapp/cy2neo/styles/gh-fork-ribbon.css | 140 -
.../webapp/cy2neo/styles/images/maze-black.png | Bin 667 -> 0 bytes
.../src/main/webapp/images/spinning-icon.gif | Bin 5266 -> 0 bytes
.../webapp/scripts/alchemy/alchemy-white.css | 698 ---
.../src/main/webapp/scripts/alchemy/alchemy.css | 714 ---
.../src/main/webapp/scripts/alchemy/alchemy.js | 3153 ----------
.../main/webapp/scripts/alchemy/alchemy.min.css | 1 -
.../main/webapp/scripts/alchemy/alchemy.min.js | 3 -
.../webapp/scripts/alchemy/scripts/vendor.js | 10 -
.../alchemy/styles/fonts/FontAwesome.otf | Bin 75188 -> 0 bytes
.../styles/fonts/fontawesome-webfont.eot | Bin 72449 -> 0 bytes
.../styles/fonts/fontawesome-webfont.svg | 504 --
.../styles/fonts/fontawesome-webfont.ttf | Bin 141564 -> 0 bytes
.../styles/fonts/fontawesome-webfont.woff | Bin 83760 -> 0 bytes
.../alchemy/styles/images/maze-black.png | Bin 667 -> 0 bytes
.../webapp/scripts/alchemy/styles/vendor.css | 8 -
.../src/main/webapp/scripts/application.js | 3 -
.../webapp/src/test/resources/NeoBrowser.PNG | Bin 39360 -> 0 bytes
example/application/simpleapp/dom/pom.xml | 2 +-
example/archetype/simpleapp/pom.xml | 4 +-
pom.xml | 1 +
tck/pom.xml | 12 +-
tck/tck-dom/pom.xml | 2 +-
tck/tck-fixture/pom.xml | 2 +-
tck/tck-integtests/pom.xml | 2 +-
tck/tck-viewer-restfulobjects/pom.xml | 2 +-
tck/tck-viewer-wicket/pom.xml | 6 +-
127 files changed, 68 insertions(+), 17687 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/applib/pom.xml
----------------------------------------------------------------------
diff --git a/core/applib/pom.xml b/core/applib/pom.xml
index ff8abb9..6560317 100644
--- a/core/applib/pom.xml
+++ b/core/applib/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-applib</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/integtestsupport/pom.xml
----------------------------------------------------------------------
diff --git a/core/integtestsupport/pom.xml b/core/integtestsupport/pom.xml
index ff96578..c6cd701 100644
--- a/core/integtestsupport/pom.xml
+++ b/core/integtestsupport/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-integtestsupport</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/log4j/pom.xml
----------------------------------------------------------------------
diff --git a/core/log4j/pom.xml b/core/log4j/pom.xml
index 7edf892..d078060 100644
--- a/core/log4j/pom.xml
+++ b/core/log4j/pom.xml
@@ -15,7 +15,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-log4j</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/maven-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/core/maven-plugin/pom.xml b/core/maven-plugin/pom.xml
index 26e20d1..c983e41 100644
--- a/core/maven-plugin/pom.xml
+++ b/core/maven-plugin/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<groupId>org.apache.isis.tool</groupId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/metamodel/pom.xml
----------------------------------------------------------------------
diff --git a/core/metamodel/pom.xml b/core/metamodel/pom.xml
index f4ae23f..cf23a83 100644
--- a/core/metamodel/pom.xml
+++ b/core/metamodel/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-metamodel</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index b976ccc..ca7df9d 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -29,7 +29,7 @@
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<packaging>pom</packaging>
@@ -1059,13 +1059,13 @@ ${license.additional-notes}
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-unittestsupport</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<!-- not scope=test, because referenced by some sql-tests-common under compile scope -->
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-unittestsupport</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
@@ -1074,14 +1074,14 @@ ${license.additional-notes}
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-applib</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-applib</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
@@ -1090,7 +1090,7 @@ ${license.additional-notes}
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-log4j</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
@@ -1099,14 +1099,14 @@ ${license.additional-notes}
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-metamodel</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-metamodel</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
@@ -1115,40 +1115,40 @@ ${license.additional-notes}
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-runtime</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-runtime</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-wrapper</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<!-- webserver -->
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-webserver</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<!-- specsupport -->
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-specsupport</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<!-- integtestsupport -->
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-integtestsupport</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<!-- not scope=test, because referenced by some sql-tests-common under compile scope -->
</dependency>
@@ -1156,36 +1156,36 @@ ${license.additional-notes}
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-viewer-restfulobjects-applib</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-viewer-restfulobjects-applib</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-viewer-restfulobjects-rendering</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-viewer-restfulobjects-rendering</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-viewer-restfulobjects-server</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-viewer-restfulobjects-server</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
@@ -1194,12 +1194,12 @@ ${license.additional-notes}
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-security</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-security-shiro</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
@@ -1207,41 +1207,41 @@ ${license.additional-notes}
<dependency>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket-applib</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket-model</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket-model</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>
<dependency>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket-ui</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket-ui</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>
<dependency>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket-impl</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket-impl</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>
@@ -1251,7 +1251,7 @@ ${license.additional-notes}
<dependency>
<groupId>org.apache.isis.tool</groupId>
<artifactId>isis-maven-plugin</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<!-- JodaTime -->
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/runtime/pom.xml
----------------------------------------------------------------------
diff --git a/core/runtime/pom.xml b/core/runtime/pom.xml
index 54db5af..83d17b1 100644
--- a/core/runtime/pom.xml
+++ b/core/runtime/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-runtime</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/security-noop/pom.xml
----------------------------------------------------------------------
diff --git a/core/security-noop/pom.xml b/core/security-noop/pom.xml
index 12336f2..30cb171 100644
--- a/core/security-noop/pom.xml
+++ b/core/security-noop/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-security</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/security-shiro/pom.xml
----------------------------------------------------------------------
diff --git a/core/security-shiro/pom.xml b/core/security-shiro/pom.xml
index 69496bc..8c9aa30 100644
--- a/core/security-shiro/pom.xml
+++ b/core/security-shiro/pom.xml
@@ -23,12 +23,12 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-security-shiro</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<name>Isis Core Shiro Security</name>
@@ -102,7 +102,7 @@
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-core-security-shiro</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/specsupport/pom.xml
----------------------------------------------------------------------
diff --git a/core/specsupport/pom.xml b/core/specsupport/pom.xml
index 81c8f95..9a6a452 100644
--- a/core/specsupport/pom.xml
+++ b/core/specsupport/pom.xml
@@ -15,7 +15,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-specsupport</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/unittestsupport/pom.xml
----------------------------------------------------------------------
diff --git a/core/unittestsupport/pom.xml b/core/unittestsupport/pom.xml
index 6fcb864..13f46cd 100644
--- a/core/unittestsupport/pom.xml
+++ b/core/unittestsupport/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-unittestsupport</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/viewer-restfulobjects-applib/pom.xml
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-applib/pom.xml b/core/viewer-restfulobjects-applib/pom.xml
index d8b60b8..5f84cab 100644
--- a/core/viewer-restfulobjects-applib/pom.xml
+++ b/core/viewer-restfulobjects-applib/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-viewer-restfulobjects-applib</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/viewer-restfulobjects-rendering/pom.xml
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/pom.xml b/core/viewer-restfulobjects-rendering/pom.xml
index f1bd33e..4543b99 100644
--- a/core/viewer-restfulobjects-rendering/pom.xml
+++ b/core/viewer-restfulobjects-rendering/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-viewer-restfulobjects-rendering</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/viewer-restfulobjects-server/pom.xml
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/pom.xml b/core/viewer-restfulobjects-server/pom.xml
index 648347e..4655aeb 100644
--- a/core/viewer-restfulobjects-server/pom.xml
+++ b/core/viewer-restfulobjects-server/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-viewer-restfulobjects-server</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/viewer-wicket/applib/pom.xml
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/applib/pom.xml b/core/viewer-wicket/applib/pom.xml
index b84004f..adc36b8 100644
--- a/core/viewer-wicket/applib/pom.xml
+++ b/core/viewer-wicket/applib/pom.xml
@@ -24,7 +24,7 @@
<parent>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-viewer-wicket-applib</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/viewer-wicket/impl/pom.xml
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/impl/pom.xml b/core/viewer-wicket/impl/pom.xml
index 03ecc90..01cc5c4 100644
--- a/core/viewer-wicket/impl/pom.xml
+++ b/core/viewer-wicket/impl/pom.xml
@@ -24,7 +24,7 @@
<parent>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<name>Isis Wicket Viewer Implementation</name>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/viewer-wicket/model/pom.xml
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/model/pom.xml b/core/viewer-wicket/model/pom.xml
index b153e4e..8ee9b5b 100644
--- a/core/viewer-wicket/model/pom.xml
+++ b/core/viewer-wicket/model/pom.xml
@@ -24,7 +24,7 @@
<parent>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-viewer-wicket-model</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/viewer-wicket/pom.xml
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/pom.xml b/core/viewer-wicket/pom.xml
index 8ebc914..892d230 100644
--- a/core/viewer-wicket/pom.xml
+++ b/core/viewer-wicket/pom.xml
@@ -24,7 +24,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<groupId>org.apache.isis.viewer</groupId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/viewer-wicket/ui/pom.xml
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/ui/pom.xml b/core/viewer-wicket/ui/pom.xml
index 7098e6e..83867a1 100644
--- a/core/viewer-wicket/ui/pom.xml
+++ b/core/viewer-wicket/ui/pom.xml
@@ -24,7 +24,7 @@
<parent>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-viewer-wicket-ui</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/webserver/pom.xml
----------------------------------------------------------------------
diff --git a/core/webserver/pom.xml b/core/webserver/pom.xml
index e96c353..964857e 100644
--- a/core/webserver/pom.xml
+++ b/core/webserver/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-webserver</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/core/wrapper/pom.xml
----------------------------------------------------------------------
diff --git a/core/wrapper/pom.xml b/core/wrapper/pom.xml
index c00cd1a..5305a43 100644
--- a/core/wrapper/pom.xml
+++ b/core/wrapper/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-core-wrapper</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/.gitignore b/example/application/neoapp/dom/.gitignore
deleted file mode 100644
index 76414b3..0000000
--- a/example/application/neoapp/dom/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-target
-target-ide
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/log4j.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/log4j.properties b/example/application/neoapp/dom/log4j.properties
deleted file mode 100644
index ca165ac..0000000
--- a/example/application/neoapp/dom/log4j.properties
+++ /dev/null
@@ -1,41 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# LOG4J Configuration
-# ===================
-
-# Basic logging goes to "datanucleus.log"
-log4j.appender.A1=org.apache.log4j.FileAppender
-log4j.appender.A1.File=datanucleus.log
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} (%t) %-5p [%c] - %m%n
-#log4j.appender.A1.Threshold=INFO
-
-# Categories
-# Each category can be set to a "level", and to direct to an appender
-
-# Default to DEBUG level for all DataNucleus categories
-log4j.logger.DataNucleus = DEBUG, A1
-
-log4j.category.com.mchange.v2.c3p0=INFO, A1
-log4j.category.com.mchange.v2.resourcepool=INFO, A1
-log4j.category.org.logicalcobwebs.proxool=INFO,A1
-
-
-# Hbase libs logging
-log4j.category.org.apache.hadoop=INFO,A1
-log4j.category.org.apache.zookeeper=INFO,A1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/pom.xml b/example/application/neoapp/dom/pom.xml
deleted file mode 100644
index e1d22e9..0000000
--- a/example/application/neoapp/dom/pom.xml
+++ /dev/null
@@ -1,162 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
---><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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.isis.example.application</groupId>
- <artifactId>neoapp</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </parent>
-
- <artifactId>neoapp-dom</artifactId>
- <name>Neo App DOM</name>
-
- <build>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- </resource>
- <resource>
- <directory>src/main/java</directory>
- <includes>
- <include>**</include>
- </includes>
- <excludes>
- <exclude>**/*.java</exclude>
- </excludes>
- </resource>
- </resources>
- <plugins>
- <plugin>
- <groupId>org.datanucleus</groupId>
- <artifactId>datanucleus-maven-plugin</artifactId>
- <version>${datanucleus-maven-plugin.version}</version>
- <configuration>
- <fork>false</fork>
- <log4jConfiguration>${basedir}/log4j.properties</log4jConfiguration>
- <verbose>true</verbose>
- <props>${basedir}/datanucleus.properties</props>
- </configuration>
- <executions>
- <execution>
- <phase>compile</phase>
- <goals>
- <goal>enhance</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- <pluginManagement>
- <plugins>
- <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
- <plugin>
- <groupId>org.eclipse.m2e</groupId>
- <artifactId>lifecycle-mapping</artifactId>
- <version>1.0.0</version>
- <configuration>
- <lifecycleMappingMetadata>
- <pluginExecutions>
- <pluginExecution>
- <pluginExecutionFilter>
- <groupId>org.datanucleus</groupId>
- <artifactId>datanucleus-maven-plugin</artifactId>
- <versionRange>[4.0.0-release,)</versionRange>
- <goals>
- <goal>enhance</goal>
- </goals>
- </pluginExecutionFilter>
- <action>
- <ignore></ignore>
- </action>
- </pluginExecution>
- </pluginExecutions>
- </lifecycleMappingMetadata>
- </configuration>
- </plugin>
- </plugins>
- </pluginManagement>
- </build>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-applib</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-unittestsupport</artifactId>
- <scope>test</scope>
- </dependency>
-
- <!-- Bytecode libraries (for mocking) -->
- <dependency>
- <groupId>org.objenesis</groupId>
- <artifactId>objenesis</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <profiles>
- <profile>
- <id>isis-validate</id>
- <activation>
- </activation>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.isis.tool</groupId>
- <artifactId>isis-maven-plugin</artifactId>
- <version>1.8.0-SNAPSHOT</version>
- <configuration>
- <isisConfigDir>../webapp/src/main/webapp/WEB-INF</isisConfigDir>
- </configuration>
- <dependencies>
- <dependency>
- <groupId>org.apache.isis.example.application</groupId>
- <artifactId>todoapp-dom</artifactId>
- <version>1.8.0-SNAPSHOT</version>
- </dependency>
- <!--
- ... workaround to avoid conflict with plexus-default
- (not sure why exclusions in the isis-maven-plugin aren't sufficient, though ...
- -->
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- <version>16.0.1</version>
- </dependency>
- </dependencies>
- <executions>
- <execution>
- <phase>test</phase>
- <goals>
- <goal>validate</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
-
-</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml b/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml
deleted file mode 100644
index 8824aa1..0000000
--- a/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<persistence xmlns="http://java.sun.com/xml/ns/persistence"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
-
- <persistence-unit name="simple">
- </persistence-unit>
-</persistence>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/main/java/dom/simple/ARecord.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/ARecord.java b/example/application/neoapp/dom/src/main/java/dom/simple/ARecord.java
deleted file mode 100644
index fa3846c..0000000
--- a/example/application/neoapp/dom/src/main/java/dom/simple/ARecord.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package dom.simple;
-
-
-import javax.inject.Inject;
-import javax.jdo.annotations.*;
-
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.ObjectType;
-import org.apache.isis.applib.annotation.Title;
-import org.apache.isis.applib.util.ObjectContracts;
-
-@PersistenceCapable(identityType=IdentityType.DATASTORE)
-@DatastoreIdentity(
- strategy= IdGeneratorStrategy.IDENTITY,
- column="id")
-@Version(
- strategy=VersionStrategy.VERSION_NUMBER,
- column="version")
-@Unique(name="A_RECORD_NAME_UNQ", members = {"name"})
-@ObjectType("A_RECORD")
-@Bookmarkable
-public class ARecord implements Comparable<ARecord> {
-
- //region > name (property)
- private String name;
-
- @Column(allowsNull="false")
- @Title(sequence="1")
- @MemberOrder(sequence="1")
- public String getName() {
- return name;
- }
-
- public void setName(final String name) {
- this.name = name;
- }
- //endregion
-
- // region > IpAddress property
- private IpAddress ipAddress;
-
- @Column(allowsNull="false")
- @Title(sequence="2")
- @MemberOrder(sequence="2")
- public IpAddress getIpAddress() {
- return ipAddress;
- }
-
- public void setIpAddress(final IpAddress ipAddress) {
- this.ipAddress = ipAddress;
- }
- //endregion
-
-
- //region > compareTo
- @Override
- public int compareTo(ARecord other) {
- return ObjectContracts.compare(this, other, "name");
- }
- //endregion
-
- //region > injected services
- @Inject
- @SuppressWarnings("unused")
- private DomainObjectContainer container;
- //endregion
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/main/java/dom/simple/Host.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/Host.java b/example/application/neoapp/dom/src/main/java/dom/simple/Host.java
deleted file mode 100644
index d206f64..0000000
--- a/example/application/neoapp/dom/src/main/java/dom/simple/Host.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package dom.simple;
-
-import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.ObjectType;
-import org.apache.isis.applib.annotation.Title;
-
-import javax.jdo.annotations.*;
-import java.util.List;
-
-@PersistenceCapable(identityType= IdentityType.DATASTORE)
-@DatastoreIdentity(
- strategy= IdGeneratorStrategy.IDENTITY,
- column="id")
-@Version(
- strategy=VersionStrategy.VERSION_NUMBER,
- column="version")
-@Unique(name="HOST_NAME_UNQ", members = {"name"})
-@ObjectType("HOST")
-@Bookmarkable
-public class Host {
-
- // region > Name property
- private String name;
-
- @Column(allowsNull="false")
- @Title(sequence="1")
- @MemberOrder(sequence="1")
- public String getName() {
- return name;
- }
-
- public void setName(final String name) {
- this.name = name;
- }
- //endregion
-
- // region > IpAddresses property
- private List<IpAddress> ipAddresses;
-
- @Column(allowsNull="false")
- @Title(sequence="2")
- @MemberOrder(sequence="2")
- public List<IpAddress> getIpAddresses() {
- return ipAddresses;
- }
-
- public void setIpAddresses(final List<IpAddress> ipAddresses) {
- this.ipAddresses = ipAddresses;
- }
- //endregion
-
- public void addIpAddress(IpAddress ipAddress){
- this.ipAddresses.add(ipAddress);
- }
-
- public void removeIpAddress(IpAddress ipAddress){
- this.ipAddresses.remove(ipAddress);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/main/java/dom/simple/Hosts.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/Hosts.java b/example/application/neoapp/dom/src/main/java/dom/simple/Hosts.java
deleted file mode 100644
index b4124f0..0000000
--- a/example/application/neoapp/dom/src/main/java/dom/simple/Hosts.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package dom.simple;
-
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.ParameterLayout;
-
-@DomainService(menuOrder = "10", repositoryFor = Host.class)
-public class Hosts {
-
- //region > create (action)
- @MemberOrder(sequence = "2")
- public Host create(
- final @ParameterLayout(named="Name") String name) {
- final Host obj = container.newTransientInstance(Host.class);
- obj.setName(name);
- container.persistIfNotAlready(obj);
- return obj;
- }
-
- //endregion
-
- //region > injected services
-
- @javax.inject.Inject
- DomainObjectContainer container;
-
- //endregion
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/main/java/dom/simple/IpAddress.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/IpAddress.java b/example/application/neoapp/dom/src/main/java/dom/simple/IpAddress.java
deleted file mode 100644
index 27c381c..0000000
--- a/example/application/neoapp/dom/src/main/java/dom/simple/IpAddress.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package dom.simple;
-
-import javax.inject.Inject;
-import javax.jdo.annotations.*;
-
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.ObjectType;
-import org.apache.isis.applib.annotation.Title;
-import org.apache.isis.applib.util.ObjectContracts;
-
-@PersistenceCapable(identityType=IdentityType.DATASTORE)
-@DatastoreIdentity(
- strategy= IdGeneratorStrategy.IDENTITY,
- column="id")
-@Version(
- strategy=VersionStrategy.VERSION_NUMBER,
- column="version")
-@Unique(name="IP_ADDRESS_ADDRESS_UNQ", members = {"address"})
-@ObjectType("IP_ADDRESS")
-@Bookmarkable
-public class IpAddress implements Comparable<IpAddress> {
-
- // region > Address property
- private String address;
-
- @Column(allowsNull="false")
- @Title(sequence="1")
- @MemberOrder(sequence="1")
- public String getAddress() {
- return address;
- }
-
- public void setAddress(final String address) {
- this.address = address;
- }
- //endregion
-
-
- //region > compareTo
- @Override
- public int compareTo(IpAddress other) {
- return ObjectContracts.compare(this, other, "address");
- }
- //endregion
-
- //region > injected services
- @Inject
- @SuppressWarnings("unused")
- private DomainObjectContainer container;
- //endregion
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java
deleted file mode 100644
index f43f038..0000000
--- a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package dom.simple;
-
-import javax.jdo.annotations.IdentityType;
-import javax.jdo.annotations.VersionStrategy;
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.ObjectType;
-import org.apache.isis.applib.annotation.Title;
-import org.apache.isis.applib.util.ObjectContracts;
-
-@javax.jdo.annotations.PersistenceCapable(identityType=IdentityType.DATASTORE)
-@javax.jdo.annotations.DatastoreIdentity(
- strategy=javax.jdo.annotations.IdGeneratorStrategy.IDENTITY,
- column="id")
-@javax.jdo.annotations.Version(
- strategy=VersionStrategy.VERSION_NUMBER,
- column="version")
-@javax.jdo.annotations.Unique(name="SimpleObject_name_UNQ", members = {"name"})
-@ObjectType("SIMPLE")
-@Bookmarkable
-public class SimpleObject implements Comparable<SimpleObject> {
-
- //region > name (property)
-
- private String name;
-
- @javax.jdo.annotations.Column(allowsNull="false")
- @Title(sequence="1")
- @MemberOrder(sequence="1")
- public String getName() {
- return name;
- }
-
- public void setName(final String name) {
- this.name = name;
- }
-
- //endregion
-
- //region > label (property)
-
- private Label label;
-
- @javax.jdo.annotations.Column(allowsNull="false")
- @Title(sequence="2")
- @MemberOrder(sequence="2")
- public Label getLabel() {
- return label;
- }
-
- public void setLabel(final Label label) {
- this.label = label;
- }
-
- //endregion
-
-
-
- //region > compareTo
-
- @Override
- public int compareTo(SimpleObject other) {
- return ObjectContracts.compare(this, other, "name");
- }
-
- //endregion
-
- //region > injected services
-
- @javax.inject.Inject
- @SuppressWarnings("unused")
- private DomainObjectContainer container;
-
- //endregion
-
- enum Label {
- NodeType1,
- NodeType2,
- AnotherNodeType
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json
deleted file mode 100644
index 35f57bb..0000000
--- a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-{
- "columns": [
- {
- "span": 6,
- "memberGroups": {
- "General": {
- "members": {
- "name": {}
- }
- }
- }
- },
- {
- "span": 0,
- "memberGroups": {}
- },
- {
- "span": 0,
- "memberGroups": {}
- },
- {
- "span": 6,
- "collections": {}
- }
- ],
- "actions": {}
-}
-
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png
deleted file mode 100644
index 3f91282..0000000
Binary files a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java
deleted file mode 100644
index 5540293..0000000
--- a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package dom.simple;
-
-import java.util.List;
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.annotation.ActionSemantics;
-import org.apache.isis.applib.annotation.ActionSemantics.Of;
-import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.ParameterLayout;
-
-@DomainService(menuOrder = "10", repositoryFor = SimpleObject.class)
-public class SimpleObjects {
-
- //region > listAll (action)
-
- @Bookmarkable
- @ActionSemantics(Of.SAFE)
- @MemberOrder(sequence = "1")
- public List<SimpleObject> listAll() {
- return container.allInstances(SimpleObject.class);
- }
-
- //endregion
-
- //region > create (action)
- @MemberOrder(sequence = "2")
- public SimpleObject create(
- final @ParameterLayout(named="Name") String name) {
- final SimpleObject obj = container.newTransientInstance(SimpleObject.class);
- obj.setName(name);
- container.persistIfNotAlready(obj);
- return obj;
- }
-
- //endregion
-
- //region > injected services
-
- @javax.inject.Inject
- DomainObjectContainer container;
-
- //endregion
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java
deleted file mode 100644
index fe6f0ac..0000000
--- a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package dom.simple;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-public class SimpleObjectTest {
-
- SimpleObject simpleObject;
-
- @Before
- public void setUp() throws Exception {
- simpleObject = new SimpleObject();
- }
-
- public static class Name extends SimpleObjectTest {
-
- @Test
- public void happyCase() throws Exception {
- // given
- String name = "Foobar";
- assertThat(simpleObject.getName(), is(nullValue()));
-
- // when
- simpleObject.setName(name);
-
- // then
- assertThat(simpleObject.getName(), is(name));
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java
deleted file mode 100644
index 27b9ac3..0000000
--- a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package dom.simple;
-
-import java.util.List;
-import com.google.common.collect.Lists;
-import org.jmock.Expectations;
-import org.jmock.Sequence;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class SimpleObjectsTest {
-
- @Rule
- public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-
- @Mock
- DomainObjectContainer mockContainer;
-
- SimpleObjects simpleObjects;
-
- @Before
- public void setUp() throws Exception {
- simpleObjects = new SimpleObjects();
- simpleObjects.container = mockContainer;
- }
-
- public static class Create extends SimpleObjectsTest {
-
- @Test
- public void happyCase() throws Exception {
-
- // given
- final SimpleObject simpleObject = new SimpleObject();
-
- final Sequence seq = context.sequence("create");
- context.checking(new Expectations() {
- {
- oneOf(mockContainer).newTransientInstance(SimpleObject.class);
- inSequence(seq);
- will(returnValue(simpleObject));
-
- oneOf(mockContainer).persistIfNotAlready(simpleObject);
- inSequence(seq);
- }
- });
-
- // when
- final SimpleObject obj = simpleObjects.create("Foobar");
-
- // then
- assertThat(obj, is(simpleObject));
- assertThat(obj.getName(), is("Foobar"));
- }
-
- }
-
- public static class ListAll extends SimpleObjectsTest {
-
- @Test
- public void happyCase() throws Exception {
-
- // given
- final List<SimpleObject> all = Lists.newArrayList();
-
- context.checking(new Expectations() {
- {
- oneOf(mockContainer).allInstances(SimpleObject.class);
- will(returnValue(all));
- }
- });
-
- // when
- final List<SimpleObject> list = simpleObjects.listAll();
-
- // then
- assertThat(list, is(all));
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/fixture/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/.gitignore b/example/application/neoapp/fixture/.gitignore
deleted file mode 100644
index 128ef84..0000000
--- a/example/application/neoapp/fixture/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/target-ide
-target
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/fixture/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/pom.xml b/example/application/neoapp/fixture/pom.xml
deleted file mode 100644
index 8291deb..0000000
--- a/example/application/neoapp/fixture/pom.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
---><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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.isis.example.application</groupId>
- <artifactId>neoapp</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </parent>
-
- <artifactId>neoapp-fixture</artifactId>
- <name>Neo App Fixtures</name>
-
- <dependencies>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>neoapp-dom</artifactId>
- </dependency>
- </dependencies>
-
-</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
deleted file mode 100644
index 690b7b6..0000000
--- a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package fixture.simple;
-
-import fixture.simple.scenario.SimpleObjectsFixture;
-
-import java.util.List;
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.DomainServiceLayout;
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Prototype;
-import org.apache.isis.applib.fixturescripts.FixtureResult;
-import org.apache.isis.applib.fixturescripts.FixtureScript;
-import org.apache.isis.applib.fixturescripts.FixtureScripts;
-import org.apache.isis.applib.fixturescripts.SimpleFixtureScript;
-
-/**
- * Enables fixtures to be installed from the application.
- */
-@DomainService
-@DomainServiceLayout(named="Prototyping", menuBar = DomainServiceLayout.MenuBar.SECONDARY, menuOrder = "20")
-public class SimpleObjectsFixturesService extends FixtureScripts {
-
- public SimpleObjectsFixturesService() {
- super("fixture.simple");
- }
-
- @Override
- public FixtureScript default0RunFixtureScript() {
- return findFixtureScriptFor(SimpleFixtureScript.class);
- }
-
- /**
- * Raising visibility to <tt>public</tt> so that choices are available for first param
- * of {@link #runFixtureScript(FixtureScript, String)}.
- */
- @Override
- public List<FixtureScript> choices0RunFixtureScript() {
- return super.choices0RunFixtureScript();
- }
-
-
- // //////////////////////////////////////
-
- @Prototype
- @MemberOrder(sequence="20")
- public Object installFixturesAndReturnFirst() {
- final List<FixtureResult> run = findFixtureScriptFor(SimpleObjectsFixture.class).run(null);
- return run.get(0).getObject();
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java
deleted file mode 100644
index 2f9be56..0000000
--- a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package fixture.simple;
-
-import org.apache.isis.applib.fixturescripts.FixtureScript;
-import org.apache.isis.objectstore.jdo.applib.service.support.IsisJdoSupport;
-
-public class SimpleObjectsTearDownFixture extends FixtureScript {
-
- @Override
- protected void execute(ExecutionContext executionContext) {
- isisJdoSupport.executeUpdate("delete from \"SimpleObject\"");
- }
-
-
- @javax.inject.Inject
- private IsisJdoSupport isisJdoSupport;
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
deleted file mode 100644
index 0edd80b..0000000
--- a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package fixture.simple.objects;
-
-import dom.simple.SimpleObject;
-import dom.simple.SimpleObjects;
-
-import org.apache.isis.applib.fixturescripts.FixtureScript;
-
-public abstract class SimpleObjectAbstract extends FixtureScript {
-
- protected SimpleObject create(final String name, ExecutionContext executionContext) {
- return executionContext.addResult(this, simpleObjects.create(name));
- }
-
- @javax.inject.Inject
- private SimpleObjects simpleObjects;
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
deleted file mode 100644
index a59aea4..0000000
--- a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package fixture.simple.objects;
-
-public class SimpleObjectForBar extends SimpleObjectAbstract {
-
- @Override
- protected void execute(ExecutionContext executionContext) {
-
- create("Bar", executionContext);
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
deleted file mode 100644
index b71baeb..0000000
--- a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package fixture.simple.objects;
-
-public class SimpleObjectForBaz extends SimpleObjectAbstract {
-
- @Override
- protected void execute(ExecutionContext executionContext) {
-
- create("Baz", executionContext);
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
deleted file mode 100644
index fa3d488..0000000
--- a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package fixture.simple.objects;
-
-public class SimpleObjectForFoo extends SimpleObjectAbstract {
-
- @Override
- protected void execute(ExecutionContext executionContext) {
-
- create("Foo", executionContext);
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
deleted file mode 100644
index c44af4b..0000000
--- a/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package fixture.simple.scenario;
-
-import fixture.simple.SimpleObjectsTearDownFixture;
-import fixture.simple.objects.SimpleObjectForBar;
-import fixture.simple.objects.SimpleObjectForBaz;
-import fixture.simple.objects.SimpleObjectForFoo;
-
-import org.apache.isis.applib.fixturescripts.FixtureScript;
-
-public class SimpleObjectsFixture extends FixtureScript {
-
- public SimpleObjectsFixture() {
- withDiscoverability(Discoverability.DISCOVERABLE);
- }
-
- @Override
- protected void execute(ExecutionContext executionContext) {
-
- executionContext.executeChild(this, new SimpleObjectsTearDownFixture());
-
- executionContext.executeChild(this, new SimpleObjectForFoo());
- executionContext.executeChild(this, new SimpleObjectForBar());
- executionContext.executeChild(this, new SimpleObjectForBaz());
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/.gitignore b/example/application/neoapp/integtests/.gitignore
deleted file mode 100644
index 3faa3ab..0000000
--- a/example/application/neoapp/integtests/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/neo4j_DB/
-target
-target-ide
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/logging.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/logging.properties b/example/application/neoapp/integtests/logging.properties
deleted file mode 100644
index d0b81cb..0000000
--- a/example/application/neoapp/integtests/logging.properties
+++ /dev/null
@@ -1,103 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-#
-# Isis uses log4j is used to provide system logging
-#
-log4j.rootCategory=INFO, Console
-
-# The console appender
-log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.target=System.out
-log4j.appender.Console.layout=org.apache.log4j.PatternLayout
-log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n
-
-log4j.appender.File=org.apache.log4j.RollingFileAppender
-log4j.appender.File.file=isis.log
-log4j.appender.File.append=false
-log4j.appender.File.layout=org.apache.log4j.PatternLayout
-log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p] %m%n
-
-
-! turn on the internal log4j debugging flag so we can see what it is doing
-#log4j.debug=true
-
-
-# DataNucleus
-# the first two log the DML and DDL (if set to DEBUG)
-log4j.logger.DataNucleus.Datastore.Native=WARN, Console
-log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console
-# the remainder can probably be left to WARN
-log4j.logger.DataNucleus.Persistence=WARN, Console
-log4j.logger.DataNucleus.Transaction=WARN, Console
-log4j.logger.DataNucleus.Connection=WARN, Console
-log4j.logger.DataNucleus.Query=WARN, Console
-log4j.logger.DataNucleus.Cache=WARN, Console
-log4j.logger.DataNucleus.MetaData=WARN, Console
-log4j.logger.DataNucleus.Datastore=WARN, Console
-log4j.logger.DataNucleus.Datastore.Persist=WARN, Console
-log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console
-log4j.logger.DataNucleus.General=WARN, Console
-log4j.logger.DataNucleus.Lifecycle=WARN, Console
-log4j.logger.DataNucleus.ValueGeneration=WARN, Console
-log4j.logger.DataNucleus.Enhancer=WARN, Console
-log4j.logger.DataNucleus.SchemaTool=ERROR, Console
-log4j.logger.DataNucleus.JDO=WARN, Console
-log4j.logger.DataNucleus.JPA=ERROR, Console
-log4j.logger.DataNucleus.JCA=WARN, Console
-log4j.logger.DataNucleus.IDE=ERROR, Console
-
-log4j.additivity.DataNucleus.Datastore.Native=false
-log4j.additivity.DataNucleus.Datastore.Schema=false
-log4j.additivity.DataNucleus.Datastore.Persistence=false
-log4j.additivity.DataNucleus.Datastore.Transaction=false
-log4j.additivity.DataNucleus.Datastore.Connection=false
-log4j.additivity.DataNucleus.Datastore.Query=false
-log4j.additivity.DataNucleus.Datastore.Cache=false
-log4j.additivity.DataNucleus.Datastore.MetaData=false
-log4j.additivity.DataNucleus.Datastore.Datastore=false
-log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false
-log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false
-log4j.additivity.DataNucleus.Datastore.General=false
-log4j.additivity.DataNucleus.Datastore.Lifecycle=false
-log4j.additivity.DataNucleus.Datastore.ValueGeneration=false
-log4j.additivity.DataNucleus.Datastore.Enhancer=false
-log4j.additivity.DataNucleus.Datastore.SchemaTool=false
-log4j.additivity.DataNucleus.Datastore.JDO=false
-log4j.additivity.DataNucleus.Datastore.JPA=false
-log4j.additivity.DataNucleus.Datastore.JCA=false
-log4j.additivity.DataNucleus.Datastore.IDE=false
-
-
-
-
-# if using log4jdbc-remix as JDBC driver
-#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console
-#log4j.additivity.jdbc.sqlonly=false
-#log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console
-#log4j.additivity.jdbc.resultsettable=false
-
-#log4j.logger.jdbc.audit=WARN,jdbc, Console
-#log4j.additivity.jdbc.audit=false
-#log4j.logger.jdbc.resultset=WARN,jdbc
-#log4j.additivity.jdbc.resultset=false
-#log4j.logger.jdbc.sqltiming=WARN,sqltiming
-#log4j.additivity.jdbc.sqltiming=false
-#log4j.logger.jdbc.connection=FATAL,connection
-#log4j.additivity.jdbc.connection=false
-
[46/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/FontAwesome.otf
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/FontAwesome.otf b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/FontAwesome.otf
deleted file mode 100644
index 3461e3f..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/FontAwesome.otf and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.eot
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.eot b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.eot
deleted file mode 100644
index 6cfd566..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.eot and /dev/null differ
[35/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror-neo.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror-neo.css b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror-neo.css
new file mode 100644
index 0000000..b11d9d8
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror-neo.css
@@ -0,0 +1,25 @@
+.code-style,#editor .cm-s-neo{font-family:Menlo,"Courier New",Terminal,monospace;font-size:16px;line-height:23px;-webkit-font-smoothing:initial}
+.cm-s-neo,.cm-s-neo.cm-s-css{color:#2e383c;}
+.cm-s-neo .cm-comment,.cm-s-neo.cm-s-css .cm-comment{color:#75787b}
+.cm-s-neo .cm-keyword,.cm-s-neo.cm-s-css .cm-keyword,.cm-s-neo .cm-property,.cm-s-neo.cm-s-css .cm-property{color:#1d75b3}
+.cm-s-neo .cm-atom,.cm-s-neo.cm-s-css .cm-atom,.cm-s-neo .cm-number,.cm-s-neo.cm-s-css .cm-number{color:#75438a}
+.cm-s-neo .cm-node,.cm-s-neo.cm-s-css .cm-node,.cm-s-neo .cm-tag,.cm-s-neo.cm-s-css .cm-tag{color:#9c3328}
+.cm-s-neo .cm-string,.cm-s-neo.cm-s-css .cm-string{color:#b35e14}
+.cm-s-neo .cm-variable,.cm-s-neo.cm-s-css .cm-variable,.cm-s-neo .cm-qualifier,.cm-s-neo.cm-s-css .cm-qualifier{color:#047d65}
+#grass .cm-s-neo{font-size:14px;line-height:18px}
+#editor .cm-s-neo{background-color:transparent;margin:25px 180px 25px 16px;-webkit-transition:all 0.4s;-moz-transition:all 0.4s;-o-transition:all 0.4s;-ms-transition:all 0.4s;transition:all 0.4s;-webkit-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-moz-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-o-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-ms-transition-timing-function:cubic-bezier(.694,.0482,.335,1);transition-timing-function:cubic-bezier(.694,.0482,.335,1);}
+#editor .cm-s-neo pre{padding:0}
+#editor .cm-s-neo .cm-s-neo-placeholder{color:#e0e2e6}
+#editor .cm-s-neo-lines{padding:0}
+#editor .cm-s-neo-gutters{border:none;border-right:10px solid transparent;background-color:transparent}
+#editor .cm-s-neo-linenumber{padding:0;color:#e0e2e5;opacity:1;-ms-filter:none;filter:none}
+#editor .cm-s-neo{height:auto}
+#editor .cm-s-neo-scroll{overflow:hidden;max-height:140px}
+#editor .cm-s-neo div.cm-s-neo-cursor{border-left:11px solid rgba(155,157,162,0.37);z-index:3}
+#editor .cm-s-neo-sizer{-webkit-transition:min-height 0.4s;-moz-transition:min-height 0.4s;-o-transition:min-height 0.4s;-ms-transition:min-height 0.4s;transition:min-height 0.4s;-webkit-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-moz-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-o-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-ms-transition-timing-function:cubic-bezier(.694,.0482,.335,1);transition-timing-function:cubic-bezier(.694,.0482,.335,1)}
+#editor .cm-s-neo-scroll div:nth-child(2){-webkit-transition:top 0.4s;-moz-transition:top 0.4s;-o-transition:top 0.4s;-ms-transition:top 0.4s;transition:top 0.4s;-webkit-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-moz-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-o-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-ms-transition-timing-function:cubic-bezier(.694,.0482,.335,1);transition-timing-function:cubic-bezier(.694,.0482,.335,1)}
+#editor .prompt{position:absolute;top:24px;left:25px;color:#93969b;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0)}
+#editor .one-line .prompt{opacity:1;-ms-filter:none;filter:none}
+#editor .one-line .cm-s-neo .cm-s-neo-linenumber{opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0)}
+#editor .disable-highlighting .cm-s-neo .cm-s-neo-code *{color:#7b7f89}
+
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror.css b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror.css
new file mode 100644
index 0000000..23eaf74
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror.css
@@ -0,0 +1,263 @@
+/* BASICS */
+
+.CodeMirror {
+ /* Set height, width, borders, and global font properties here */
+ font-family: monospace;
+ height: 300px;
+}
+.CodeMirror-scroll {
+ /* Set scrolling behaviour here */
+ overflow: auto;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+ padding: 4px 0; /* Vertical padding around content */
+}
+.CodeMirror pre {
+ padding: 0 4px; /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+ background-color: white; /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+ border-right: 1px solid #ddd;
+ background-color: #f7f7f7;
+ white-space: nowrap;
+}
+.CodeMirror-linenumbers {}
+.CodeMirror-linenumber {
+ padding: 0 3px 0 5px;
+ min-width: 20px;
+ text-align: right;
+ color: #999;
+}
+
+/* CURSOR */
+
+.CodeMirror div.CodeMirror-cursor {
+ border-left: 1px solid black;
+ z-index: 3;
+}
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+ border-left: 1px solid silver;
+}
+.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
+ width: auto;
+ border: 0;
+ background: #7e7;
+ z-index: 1;
+}
+/* Can style cursor different in overwrite (non-insert) mode */
+.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
+
+.cm-tab { display: inline-block; }
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-keyword {color: #708;}
+.cm-s-default .cm-atom {color: #219;}
+.cm-s-default .cm-number {color: #164;}
+.cm-s-default .cm-def {color: #00f;}
+.cm-s-default .cm-variable {color: black;}
+.cm-s-default .cm-variable-2 {color: #05a;}
+.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-property {color: black;}
+.cm-s-default .cm-operator {color: black;}
+.cm-s-default .cm-comment {color: #a50;}
+.cm-s-default .cm-string {color: #a11;}
+.cm-s-default .cm-string-2 {color: #f50;}
+.cm-s-default .cm-meta {color: #555;}
+.cm-s-default .cm-qualifier {color: #555;}
+.cm-s-default .cm-builtin {color: #30a;}
+.cm-s-default .cm-bracket {color: #997;}
+.cm-s-default .cm-tag {color: #170;}
+.cm-s-default .cm-attribute {color: #00c;}
+.cm-s-default .cm-header {color: blue;}
+.cm-s-default .cm-quote {color: #090;}
+.cm-s-default .cm-hr {color: #999;}
+.cm-s-default .cm-link {color: #00c;}
+
+.cm-negative {color: #d44;}
+.cm-positive {color: #292;}
+.cm-header, .cm-strong {font-weight: bold;}
+.cm-em {font-style: italic;}
+.cm-link {text-decoration: underline;}
+
+.cm-s-default .cm-error {color: #f00;}
+.cm-invalidchar {color: #f00;}
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+.CodeMirror-activeline-background {background: #e8f2ff;}
+
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+ the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+ line-height: 1;
+ position: relative;
+ overflow: hidden;
+ background: white;
+ color: black;
+}
+
+.CodeMirror-scroll {
+ /* 30px is the magic margin used to hide the element's real scrollbars */
+ /* See overflow: hidden in .CodeMirror */
+ margin-bottom: -30px; margin-right: -30px;
+ padding-bottom: 30px; padding-right: 30px;
+ height: 100%;
+ outline: none; /* Prevent dragging from highlighting the element */
+ position: relative;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+.CodeMirror-sizer {
+ position: relative;
+}
+
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+ before actuall scrolling happens, thus preventing shaking and
+ flickering artifacts. */
+.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+ position: absolute;
+ z-index: 6;
+ display: none;
+}
+.CodeMirror-vscrollbar {
+ right: 0; top: 0;
+ overflow-x: hidden;
+ overflow-y: scroll;
+}
+.CodeMirror-hscrollbar {
+ bottom: 0; left: 0;
+ overflow-y: hidden;
+ overflow-x: scroll;
+}
+.CodeMirror-scrollbar-filler {
+ right: 0; bottom: 0;
+}
+.CodeMirror-gutter-filler {
+ left: 0; bottom: 0;
+}
+
+.CodeMirror-gutters {
+ position: absolute; left: 0; top: 0;
+ padding-bottom: 30px;
+ z-index: 3;
+}
+.CodeMirror-gutter {
+ white-space: normal;
+ height: 100%;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ padding-bottom: 30px;
+ margin-bottom: -32px;
+ display: inline-block;
+ /* Hack to make IE7 behave */
+ *zoom:1;
+ *display:inline;
+}
+.CodeMirror-gutter-elt {
+ position: absolute;
+ cursor: default;
+ z-index: 4;
+}
+
+.CodeMirror-lines {
+ cursor: text;
+}
+.CodeMirror pre {
+ /* Reset some styles that the rest of the page might have set */
+ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
+ border-width: 0;
+ background: transparent;
+ font-family: inherit;
+ font-size: inherit;
+ margin: 0;
+ white-space: pre;
+ word-wrap: normal;
+ line-height: inherit;
+ color: inherit;
+ z-index: 2;
+ position: relative;
+ overflow: visible;
+}
+.CodeMirror-wrap pre {
+ word-wrap: break-word;
+ white-space: pre-wrap;
+ word-break: normal;
+}
+.CodeMirror-code pre {
+ border-right: 30px solid transparent;
+ width: -webkit-fit-content;
+ width: -moz-fit-content;
+ width: fit-content;
+}
+.CodeMirror-wrap .CodeMirror-code pre {
+ border-right: none;
+ width: auto;
+}
+.CodeMirror-linebackground {
+ position: absolute;
+ left: 0; right: 0; top: 0; bottom: 0;
+ z-index: 0;
+}
+
+.CodeMirror-linewidget {
+ position: relative;
+ z-index: 2;
+ overflow: auto;
+}
+
+.CodeMirror-widget {}
+
+.CodeMirror-wrap .CodeMirror-scroll {
+ overflow-x: hidden;
+}
+
+.CodeMirror-measure {
+ position: absolute;
+ width: 100%;
+ height: 0;
+ overflow: hidden;
+ visibility: hidden;
+}
+.CodeMirror-measure pre { position: static; }
+
+.CodeMirror div.CodeMirror-cursor {
+ position: absolute;
+ visibility: hidden;
+ border-right: none;
+ width: 0;
+}
+.CodeMirror-focused div.CodeMirror-cursor {
+ visibility: visible;
+}
+
+.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
+
+.cm-searching {
+ background: #ffa;
+ background: rgba(255, 255, 0, .4);
+}
+
+/* IE7 hack to prevent it from returning funny offsetTops on the spans */
+.CodeMirror span { *vertical-align: text-bottom; }
+
+@media print {
+ /* Hide the cursor when printing */
+ .CodeMirror div.CodeMirror-cursor {
+ visibility: hidden;
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/cy2neo.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/cy2neo.css b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/cy2neo.css
new file mode 100644
index 0000000..52070e6
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/cy2neo.css
@@ -0,0 +1,21 @@
+svg {
+ background: #333;
+}
+.CodeMirror, .CodeMirror-scroll {
+ height:auto;
+}
+
+#execute {
+ font-size:30px;
+ position:absolute;
+ top: 0.6em;
+ right: 10em;
+}
+
+#neo4jUrl {
+ position:absolute;
+ right: 5px;
+ top: 1em;
+ z-index: 100;
+ width: 20em;
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/FontAwesome.otf
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/FontAwesome.otf b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/FontAwesome.otf
new file mode 100644
index 0000000..3461e3f
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/FontAwesome.otf differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.eot
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.eot b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..6cfd566
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.eot differ
[34/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.svg
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.svg b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..a9f8469
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.svg
@@ -0,0 +1,504 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="	" horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="¨" horiz-adv-x="1792" />
+<glyph unicode="©" horiz-adv-x="1792" />
+<glyph unicode="®" horiz-adv-x="1792" />
+<glyph unicode="´" horiz-adv-x="1792" />
+<glyph unicode="Æ" horiz-adv-x="1792" />
+<glyph unicode="Ø" horiz-adv-x="1792" />
+<glyph unicode=" " horiz-adv-x="768" />
+<glyph unicode=" " horiz-adv-x="1537" />
+<glyph unicode=" " horiz-adv-x="768" />
+<glyph unicode=" " horiz-adv-x="1537" />
+<glyph unicode=" " horiz-adv-x="512" />
+<glyph unicode=" " horiz-adv-x="384" />
+<glyph unicode=" " horiz-adv-x="256" />
+<glyph unicode=" " horiz-adv-x="256" />
+<glyph unicode=" " horiz-adv-x="192" />
+<glyph unicode=" " horiz-adv-x="307" />
+<glyph unicode=" " horiz-adv-x="85" />
+<glyph unicode=" " horiz-adv-x="307" />
+<glyph unicode=" " horiz-adv-x="384" />
+<glyph unicode="™" horiz-adv-x="1792" />
+<glyph unicode="∞" horiz-adv-x="1792" />
+<glyph unicode="≠" horiz-adv-x="1792" />
+<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="" horiz-adv-x="1792" d="M93 1350q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78z" />
+<glyph unicode="" d="M0 -64q0 50 34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5 q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 32v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5 t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768zM128 1120q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317 q54 43 100.5 115.5t46.5 131.5v11v13.5t-0.5 13t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z " />
+<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354 q-25 27 -25 48zM221 829l306 -297l-73 -421l378 199l377 -199l-72 421l306 297l-422 62l-189 382l-189 -382z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 131q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5 h-874q-121 0 -194 69.5t-73 189.5zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 -96v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 64v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 320q0 -26 19 -45t45 -19h128 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19 h-128q-26 0 -45 -19t-19 -45v-128zM512 -64q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM512 704q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM1536 64 v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM1536 320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19
-45v-128zM1536 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 128v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM0 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 128v384q0 52 38 90t90 38h512q52 0 90 -38 t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 608v192 q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1792" d="M121 608q0 40 28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68z" />
+<glyph unicode="" horiz-adv-x="1408" d="M110 214q0 40 28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-294 -294l294 -294q28 -28 28 -68t-28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294 q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" d="M0 640q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181 q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298zM640 768v640q0 52 38 90t90 38t90 -38t38 -90v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 -96v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM384 -96v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM768 -96v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576 q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 -96v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1536 -96v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23z" />
+<glyph unicode="" d="M0 531v222q0 12 8 23t19 13l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10 q129 -119 165 -170q7 -8 7 -22q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108 q-44 -23 -91 -38q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5z M512 640q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 1056v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23zM256 76q0 -22 7 -40.5 t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5v948h-896v-948zM384 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM640 224v576q0 14 9 23t23 9h64 q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM896 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23z" />
+<glyph unicode="" horiz-adv-x="1664" d="M26 636.5q1 13.5 11 21.5l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5zM256 64 v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45z" />
+<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22 v-376z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 544v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
+<glyph unicode="" horiz-adv-x="1920" d="M50 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256 q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73zM809 540q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 96v320q0 40 28 68t68 28h465l135 -136q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 985q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39q17 -41 -14 -70 l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70zM1152 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM418 620q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM416 672q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23z" />
+<glyph unicode="" d="M0 64v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552q25 -61 25 -123v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM197 576h316l95 -192h320l95 192h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8 t-2.5 -8z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 320v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55t-32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56z" />
+<glyph unicode="" d="M0 640q0 156 61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5 t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298z" />
+<glyph unicode="" d="M0 0v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129 q-19 -19 -45 -19t-45 19t-19 45zM18 800v7q65 268 270 434.5t480 166.5q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179 q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 160v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832z M256 288v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 544v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z M256 800v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 288v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z M512 544v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5zM512 800v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -
13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z " />
+<glyph unicode="" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192z" />
+<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110zM320 320v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19 q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 650q0 151 67 291t179 242.5t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32 q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32 q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314z" />
+<glyph unicode="" horiz-adv-x="768" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1152" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5zM1008 228q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5 q140 -59 225 -188.5t85 -282.5t-85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45zM1109 -7q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19 q13 0 26 -5q211 -91 338 -283.5t127 -422.5t-127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 0v640h640v-640h-640zM0 768v640h640v-640h-640zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM256 256v128h128v-128h-128zM256 1024v128h128v-128h-128zM768 0v640h384v-128h128v128h128v-384h-384v128h-128v-384h-128zM768 768v640h640v-640h-640z M896 896h384v384h-384v-384zM1024 0v128h128v-128h-128zM1024 1024v128h128v-128h-128zM1280 0v128h128v-128h-128z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 0v1408h63v-1408h-63zM94 1v1407h32v-1407h-32zM189 1v1407h31v-1407h-31zM346 1v1407h31v-1407h-31zM472 1v1407h62v-1407h-62zM629 1v1407h31v-1407h-31zM692 1v1407h31v-1407h-31zM755 1v1407h31v-1407h-31zM880 1v1407h63v-1407h-63zM1037 1v1407h63v-1407h-63z M1163 1v1407h63v-1407h-63zM1289 1v1407h63v-1407h-63zM1383 1v1407h63v-1407h-63zM1541 1v1407h94v-1407h-94zM1666 1v1407h32v-1407h-32zM1729 0v1408h63v-1408h-63z" />
+<glyph unicode="" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM704 1408h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M10 184q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23 t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57 q38 -15 59 -43q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5zM575 1056 q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 160v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-224 q-13 0 -22.5 9.5t-9.5 22.5zM384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1408 576q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 128v896q0 106 75 181t181 75h224l51 136q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181zM512 576q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM672 576q0 119 84.5 203.5t203.5 84.5t203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8 t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27 q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14zM555 527q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5 t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12zM533 1292q0 -50 4 -151t4 -152q0 -27 -0.5 -80 t-0.5 -79q0 -46 1 -69q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13zM538.5 165q0.5 -37 4.5 -83.5t12 -66.5q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25 t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5 q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9 t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44zM1414 109.5q9 18.5 42 18.5h80v1024 h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5z" />
+<glyph unicode="" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1 t-103 1t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29 t78 27q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44zM5 -64q0 28 26 49q4 3 36 30t59.5 49 t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5q12 0 42 -19.5t57.5 -41.5t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-5
7.5 -41.5t-42 -19.5q-13 0 -20.5 10.5 t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1536 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h896 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h1280 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 416v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5zM0 800v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192 q-13 0 -22.5 9.5t-9.5 22.5zM384 32v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 416v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 800v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 1184v192q0 13 9.5 22.5t22.5 9.5h1344q13 0
22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5 t-9.5 22.5zM32 704q0 14 9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088 q-13 0 -22.5 9.5t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 416v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23t-9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5z M0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5 t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5q39 -17 39 -59v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5 t-84.5 203.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v192l320 320l160 -160l512 512l416 -416v-448h-1408zM256 960q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" />
+<glyph unicode="" d="M0 -128v416l832 832l416 -416l-832 -832h-416zM128 128h128v-128h107l91 91l-235 235l-91 -91v-107zM298 384q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17zM896 1184l166 165q36 38 90 38q53 0 91 -38l235 -234 q37 -39 37 -91q0 -53 -37 -90l-166 -166z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 896q0 212 150 362t362 150t362 -150t150 -362q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179zM256 896q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73v1088q-148 0 -273 -73t-198 -198t-73 -273z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 512q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275q0 -212 -150 -362t-362 -150t-362 150t-150 362zM256 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29v-190 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM640 256v288l672 672l288 -288l-672 -672h-288zM736 448h96v-96h56l116 116l-152 152l-116 -116v-56zM944 688q16 -16 33 1l350 350q17 17 1 33t-33 -1l-350 -350q-17 -17 -1 -33zM1376 1280l92 92 q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68l-92 -92z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h255q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29v-259 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM256 704q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45l-384 -384 q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5t-38.5 114t-17.5 122z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3 q20 -8 20 -29v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM257 768q0 33 24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110q24 -24 24 -57t-24 -57l-814 -814q-24 -24 -57 -24t-57 24l-430 430 q-24 24 -24 57z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256 q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-710q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45 t-45 -19h-128q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M122 640q0 26 19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 -96v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31l-1328 -738q-23 -13 -39.5 -3t-16.5 36z" />
+<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM896 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45z" />
+<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32v710 q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
+<glyph unicode="" horiz-adv-x="1538" d="M1 64v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM1 525q-6 13 13 32l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13z" />
+<glyph unicode="" horiz-adv-x="1280" d="M154 704q0 26 19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1280" d="M90 128q0 26 19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19 t19 45v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19 t-19 -45v-128z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM387 414q0 -27 19 -46l90 -90q19 -19 46 -19q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19 l90 90q19 19 19 46q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 621q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45q0 28 -18 46l-91 90 q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM417 939q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26 t37.5 -59q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213zM640 160q0 -14 9 -23t23 -9 h192q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320 q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160zM640 1056q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160z" />
+<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143 q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45zM339 512q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5h-109q-26 0 -45 19 t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM429 480q0 13 10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23l-137 -137l137 -137q10 -10 10 -23t-10 -23l-146 -146q-10 -10 -23 -10t-23 10l-137 137 l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM346 640q0 26 19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45z" />
+<glyph unicode="" d="M0 643q0 157 61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5t-61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61t-245 164t-163.5 246t-61 300zM224 643q0 -162 89 -299l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199 t-73 -274zM471 185q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5q0 161 -87 295z" />
+<glyph unicode="" d="M64 576q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5t32.5 -90.5v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90 z" />
+<glyph unicode="" d="M0 512v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M53 565q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651q37 -39 37 -91q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75 q-38 38 -38 90z" />
+<glyph unicode="" horiz-adv-x="1664" d="M53 704q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 416q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45t-19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123 q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22t-13.5 30t-10.5 24q-127 285 -127 451z" />
+<glyph unicode="" d="M0 -64v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45zM781 800q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448 q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
+<glyph unicode="" d="M13 32q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23zM768 704v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10 t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M122.5 408.5q13.5 51.5 59.5 77.5l266 154l-266 154q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5 l-266 -154l266 -154q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 1126l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5l18 621q0 12 -10 18 q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18zM640 161q0 -13 10 -23t23 -10h192q13 0 22 9.5t9 23.5v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190z" />
+<glyph unicode="" d="M0 544v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68 t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23zM376 1120q0 -40 28 -68t68 -28h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68zM608 180q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5v56v468v192h-320v-192v-468v-56zM870 1024h194q40 0 68 28 t28 68t-28 68t-68 28q-43 0 -69 -31z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 121q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96 q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5zM384 448q0 -26 19 -45t45 -19q24 0 45 19 q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45t-19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 -160q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64zM256 640q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100 t113.5 -122.5t72.5 -150.5t27.5 -184q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 34 20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69t-20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69zM128 576q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5q-152 236 -381 353 q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 38 20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5q16 -10 16 -27q0 -7 -1 -9q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87 q-143 65 -263.5 173t-208.5 245q-20 31 -20 69zM128 576q167 -258 427 -375l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5zM896 0l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69t-20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95zM1056 286l280 502q8 -45 8 -84q0 -139 -79 -253.5t-209 -164.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M16 61l768 1408q17 31 47 49t65 18t65 -18t47 -49l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126zM752 992l17 -457q0 -10 10 -16.5t24 -6.5h185q14 0 23.5 6.5t10.5 16.5l18 459q0 12 -10 19q-13 11 -24 11h-220 q-11 0 -24 -11q-10 -7 -10 -21zM768 161q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 477q-1 13 9 25l96 97q9 9 23 9q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16 l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h288v288h-288v-288zM128 224 h288v320h-288v-320zM128 608h288v288h-288v-288zM384 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM480 -128h320v288h-320v-288zM480 224h320v320h-320v-320zM480 608h320v288h-320 v-288zM864 -128h320v288h-320v-288zM864 224h320v320h-320v-320zM864 608h320v288h-320v-288zM1152 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM1248 -128h288v288h-288v-288z M1248 224h288v320h-288v-320zM1248 608h288v288h-288v-288z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 160v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23zM0 1056v192q0 14 9 23t23 9h224q250 0 410 -225q-60 -92 -137 -273q-22 45 -37 72.5 t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23zM743 353q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 q-32 0 -85 -0.5t-81 -1t-73 1t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5 t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281z" />
+<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5 t-98.5 362zM0 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM1024 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M90 250.5q0 26.5 19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M90 773.5q0 26.5 19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 704q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45z M640 1120q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20z " />
+<glyph unicode="" horiz-adv-x="1664" d="M0 1216q0 26 19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024 q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45zM384 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1280 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5t-0.5 12.5zM73 56q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43 q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43z" />
+<glyph unicode="" horiz-adv-x="768" d="M64 64q0 26 19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v384h256v-384h-256zM640 128v896h256v-896h-256zM1024 128v640h256v-640h-256zM1408 128v1024h256v-1024h-256z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 286q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109 q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4q21 -63 74.5 -104 t121.5 -42q-116 -90 -261 -90q-26 0 -50 3z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544 q-119 0 -203.5 84.5t-84.5 203.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 0v1280q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM128 0h1536v128h-1536v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM256 1216h384v128h-384v-128zM512 574 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM640 574q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM736 576q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9 t9 23t-9 23t-23 9q-66 0 -113 -47t-47 -113z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 752q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41q0 -17 -49 -66t-66 -49 q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5zM192 768q0 -80 56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56 t56 136t-56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 549v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8 q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90 q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5zM384 640q0 -106 75 -181t181 -75 t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM1152 58v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0
-25 -51 -138q17 -23 30 -52q149 -15 149 -31 v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1152 1082v140q0 16 149 31q13 29 30 52 q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71 q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1408 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90zM1408 1152q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM616 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5 t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
+<glyph unicode="" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5 t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85 t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640z" />
+<glyph unicode="" d="M0 512v640q0 53 37.5 90.5t90.5 37.5h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186 q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5zM128 1088q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 512h32q16 0 35.5 -9 t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5 t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640z" />
+<glyph unicode="" horiz-adv-x="896" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z M128 940q0 -168 187 -355l581 -560l580 559q188 188 188 356q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5 t-21.5 -143z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5q0 -4 1 -20t0.5 -26.5t-3 -23.5 t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5zM384 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM223 1030q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86z M237 122h231v694h-231v-694zM595 122h231v388q0 38 7 56q15 35 45 59.5t74 24.5q116 0 116 -157v-371h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694z" />
+<glyph unicode="" horiz-adv-x="1152" d="M0 320q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19 t-19 45zM416 672q0 -14 9 -23t23 -9t23 9t9 23v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832 q-119 0 -203.5 84.5t-84.5 203.5zM685 576q0 13 10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
+<glyph unicode="" d="M0 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45zM894.5 78.5q0.5 10.5 3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113 t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5q0 4 -1 20t-0.5 26.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 928v128q0 40 28 68t68 28h288v96q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91t97.5 -37q75 0 133.5 -45.5 t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143zM128 928q0 -78 94.5 -162t235.5 -113q-74 162 -74 371 h-256v-96zM1206 653q141 29 235.5 113t94.5 162v96h-256q0 -209 -74 -371z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204 q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52 t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5h-224q-119 0 -203.5 84.5t-84.5 203.5zM271 315q3 5 13 2 q10 -5 7 -12q-5 -7 -13 -2q-10 5 -7 12zM304 290q6 6 16 -3q9 -11 2 -16q-6 -7 -16 3q-9 11 -2 16zM335 233q-9 13 0 18q9 7 17 -6q9 -12 0 -19q-8 -6 -17 7zM370 206q8 9 20 -3q12 -11 4 -19q-8 -9 -20 3q-13 11 -4 19zM419 168q4 11 19 7q
16 -5 13 -16q-4 -12 -19 -6 q-17 4 -13 15zM481 154q0 11 16 11q17 2 17 -11q0 -11 -16 -11q-17 -2 -17 11zM540 158q-2 12 14 15q16 2 18 -9q2 -10 -14 -14t-18 8z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 -32v320q0 40 28 68t68 28h427q21 -56 70.5 -92t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 936q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69q-17 -40 -59 -40 h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40zM1152 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 433q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5q0 -165 -70 -327.5 t-196 -288t-281 -180.5q-124 -44 -326 -44q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5zM128 434q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5 q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24 q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 1069q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235 t235 -174q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5 t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832z" />
+<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62zM128 38l423 406l89 85l89 -85l423 -406 v1242h-1024v-1242z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 905q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5 q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5 t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M44 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5 q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145z" />
+<glyph unicode="" horiz-adv-x="1024" d="M95 631v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44 l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3 q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 96v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v608h-1664v-608zM128 1024h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600 q-13 0 -22.5 -9.5t-9.5 -22.5v-224zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 192q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 697v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5t259 -181.5q114 -113 181.5 -259t80.5 -306q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5 t-391.5 184.5q-25 2 -41.5 20t-16.5 43zM0 1201v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294q187 -186 294 -425.5t120 -501.5q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102 q-25 1 -42.5 19.5t-17.5 43.5z" />
+<glyph unicode="" d="M0 160v320q0 25 16 75l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM880 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1136 320q0 33 23.5 56.5t56.5 23.5 t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 672v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50 t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113zM768 633q377 -42 768 -341v954q-394 -302 -768 -343v-270z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
+<glyph unicode="" d="M2 435q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70l-53 -186l188 -48 q40 -10 52 -51q10 -42 -20 -70l-138 -135l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53 q-41 -12 -70 19q-31 29 -19 70l53 186l-188 48q-40 10 -52 51z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179q0 -105 -75.5 -181 t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q72 0 167 -32 t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139 q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106q-69 -57 -140 -57h-32v-640z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 769q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5v-640 q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181zM128 768q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119 q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5 t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5t-39 -89.5zM1536 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 640q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5t-90.5 -37.5h-640 q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5zM128 640q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140 v-32h640v32q0 72 32 167t64 193.5t32 179.5q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576q-20 0 -48.5 15t-55 33t-68 33t-84.5 15 q-67 0 -97.5 -44.5t-30.5 -115.5zM1152 -64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 640q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317q0 -142 -77.5 -230t-217.5 -87 l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5zM128 640q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33t55 33t48.5 15v-576q0 -50 38.5 -89 t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112 q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5zM1152 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM251 640q0 -27 18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM256 576q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18 l362 362l91 91q18 18 18 45t-18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 641q0 -27 18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19 t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45t-18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 639q0 -27 18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45t-18 45l-91 91 q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM226 979q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18 q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13 q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5 t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.
5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13 q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25 t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5 t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4 q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5q15 10 -7 16q-17 5 -43 -12q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.
5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8 q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5 q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26 q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5 q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -
4.5t-6 -4q-3 -4 0 -14t-2 -14 q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5 q-16 0 -22 -1q-146 -80 -235 -222zM877 26q0 -6 2 -16q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7 t-10 1.5t-11.5 -7q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M21 0q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90zM256 64q0
<TRUNCATED>
[36/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/vendor.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/vendor.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/vendor.js
new file mode 100644
index 0000000..b94281f
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/vendor.js
@@ -0,0 +1,10 @@
+if(function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b=a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(hb.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=ob[a]={};return _.each(a.match(nb)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.
cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ub,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:tb.test(c)?_.parseJSON(c):c}catch(e){}sb.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Kb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)rb.set(a[c],"globalEval",!b||rb.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(rb.hasData(a)&&(f=rb.access(a),g=rb.set(b
,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sb.hasData(a)&&(h=sb.access(a),i=_.extend({},h),sb.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&yb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Ob[a];return c||(c=t(a,b),"none"!==c&&c||(Nb=(Nb||_("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=Nb[0].contentDocument,b.write(),b.close(),c=t(a,b),Nb.detach()),Ob[a]=c),c}function v(a,b,c){var d,e,f,g,h=a.style;return c=c||Rb(a),c&&(g=c.getProp
ertyValue(b)||c[b]),c&&(""!==g||_.contains(a.ownerDocument,a)||(g=_.style(a,b)),Qb.test(g)&&Pb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function w(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function x(a,b){if(b in a)return b;for(var c=b[0].toUpperCase()+b.slice(1),d=b,e=Xb.length;e--;)if(b=Xb[e]+c,b in a)return b;return d}function y(a,b,c){var d=Tb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=_.css(a,c+wb[f],!0,e)),d?("content"===c&&(g-=_.css(a,"padding"+wb[f],!0,e)),"margin"!==c&&(g-=_.css(a,"border"+wb[f]+"Width",!0,e))):(g+=_.css(a,"padding"+wb[f],!0,e),"padding"!==c&&(g+=_.css(a,"border"+wb[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Rb(a),g="border-box"
===_.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=v(a,b,f),(0>e||null==e)&&(e=a.style[b]),Qb.test(e))return e;d=g&&(Y.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=rb.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&xb(d)&&(f[g]=rb.access(d,"olddisplay",u(d.nodeName)))):(e=xb(d),"none"===c&&e||rb.set(d,"olddisplay",e?c:_.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function C(a,b,c,d,e){return new C.prototype.init(a,b,c,d,e)}function D(){return setTimeout(function(){Yb=void 0}),Yb=_.now()}function E(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=wb[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function F(a,b,c){for(var d,e=(cc[b]||[]).concat(cc["*"]),f=0,g=e.l
ength;g>f;f++)if(d=e[f].call(c,b,a))return d}function G(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},n=a.style,o=a.nodeType&&xb(a),p=rb.get(a,"fxshow");c.queue||(h=_._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,_.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[n.overflow,n.overflowX,n.overflowY],j=_.css(a,"display"),k="none"===j?rb.get(a,"olddisplay")||u(a.nodeName):j,"inline"===k&&"none"===_.css(a,"float")&&(n.display="inline-block")),c.overflow&&(n.overflow="hidden",l.always(function(){n.overflow=c.overflow[0],n.overflowX=c.overflow[1],n.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],$b.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(o?"hide":"show")){if("show"!==e||!p||void 0===p[d])continue;o=!0}m[d]=p&&p[d]||_.style(a,d)}else j=void 0;if(_.isEmptyObject(m))"inline"===("none"===j?u(a.nodeName):j)&&(n.displ
ay=j);else{p?"hidden"in p&&(o=p.hidden):p=rb.access(a,"fxshow",{}),f&&(p.hidden=!o),o?_(a).show():l.done(function(){_(a).hide()}),l.done(function(){var b;rb.remove(a,"fxshow");for(b in m)_.style(a,b,m[b])});for(d in m)g=F(o?p[d]:0,d,l),d in p||(p[d]=g.start,o&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function H(a,b){var c,d,e,f,g;for(c in a)if(d=_.camelCase(c),e=b[d],f=a[c],_.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=_.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function I(a,b,c){var d,e,f=0,g=bc.length,h=_.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Yb||D(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:_.extend({},b),opts:_.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c
,startTime:Yb||D(),duration:c.duration,tweens:[],createTween:function(b,c){var d=_.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(H(k,j.opts.specialEasing);g>f;f++)if(d=bc[f].call(j,a,k,j.opts))return d;return _.map(k,F,j),_.isFunction(j.opts.start)&&j.opts.start.call(a,j),_.fx.timer(_.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function J(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(nb)||[];if(_.isFunction(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function K(a,b,c,d){function e(h){var i;return f[h]=!0,_.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeo
f j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===vc;return e(b.dataTypes[0])||!f["*"]&&e("*")}function L(a,b){var c,d,e=_.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&_.extend(!0,a,d),a}function M(a,b,c){for(var d,e,f,g,h=a.contents,i=a.dataTypes;"*"===i[0];)i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function N(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];for(f=k.shift();f;)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+"
"+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}function O(a,b,c,d){var e;if(_.isArray(b))_.each(b,function(b,e){c||zc.test(a)?d(a,e):O(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==_.type(b))d(a,b);else for(e in b)O(a+"["+e+"]",b[e],c,d)}function P(a){return _.isWindow(a)?a:9===a.nodeType&&a.defaultView}var Q=[],R=Q.slice,S=Q.concat,T=Q.push,U=Q.indexOf,V={},W=V.toString,X=V.hasOwnProperty,Y={},Z=a.document,$="2.1.1",_=function(a,b){return new _.fn.init(a,b)},ab=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bb=/^-ms-/,cb=/-([\da-z])/gi,db=function(a,b){return b.toUpperCase()};_.fn=_.prototype={jquery:$,constructor:_,selector:"",length:0,toArray:function(){return R.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:R.call(this)},pushStack:function(a){var b
=_.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return _.each(this,a,b)},map:function(a){return this.pushStack(_.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(R.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:T,sort:Q.sort,splice:Q.splice},_.extend=_.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||_.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(_.isPlainObject(d)||(e=_.isArray(d)))?(e?(e=!1,f=c&&_.isArray(c)?c:[]):f=c&&_.isPlainObject(c)?c:{},g[b]=_.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},_.extend({e
xpando:"jQuery"+($+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===_.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!_.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==_.type(a)||a.nodeType||_.isWindow(a)?!1:a.constructor&&!X.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?V[W.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=_.trim(a),a&&(1===a.indexOf("use strict")?(b=Z.createElement("script"),b.text=a,Z.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(bb,"ms-").replace(cb,db)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.le
ngth,h=c(a);if(d){if(h)for(;g>f&&(e=b.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=b.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=b.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),e===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(ab,"")},makeArray:function(a,b){var d=b||[];return null!=a&&(c(Object(a))?_.merge(d,"string"==typeof a?[a]:a):T.call(d,a)),d},inArray:function(a,b,c){return null==b?-1:U.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,d){var e,f=0,g=a.length,h=c(a),i=[];if(h)for(;g>f;f++)e=b(a[f],f,d),null!=e&&i.push(e);else for(f in a)e=b(a[f],f,d),null!=e&&i.push(e);return S.apply([],i)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),_.isFunction(a)?(d=R.call(arguments,2),e=function(){return a.apply(b||t
his,d.concat(R.call(arguments)))},e.guid=a.guid=a.guid||_.guid++,e):void 0},now:Date.now,support:Y}),_.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){V["[object "+b+"]"]=b.toLowerCase()});var eb=function(a){function b(a,b,c,d){var e,f,g,h,i,j,l,n,o,p;if((b?b.ownerDocument||b:O)!==G&&F(b),b=b||G,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(I&&!d){if(e=sb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&M(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return _.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&v.getElementsByClassName&&b.getElementsByClassName)return _.apply(c,b.getElementsByClassName(g)),c}if(v.qsa&&(!J||!J.test(a))){if(n=l=N,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(j=z(a),(l=b.getAttribute("id"))?n=l.replace(ub,"\\$&"):b.setAttribute("id",
n),n="[id='"+n+"'] ",i=j.length;i--;)j[i]=n+m(j[i]);o=tb.test(a)&&k(b.parentNode)||b,p=j.join(",")}if(p)try{return _.apply(c,o.querySelectorAll(p)),c}catch(q){}finally{l||b.removeAttribute("id")}}}return B(a.replace(ib,"$1"),b,c,d)}function c(){function a(c,d){return b.push(c+" ")>w.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[N]=!0,a}function e(a){var b=G.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=a.length;d--;)w.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return d(fu
nction(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function k(a){return a&&typeof a.getElementsByTagName!==V&&a}function l(){}function m(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function n(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=Q++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[P,f];if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e){if(i=b[N]||(b[N]={}),(h=i[d])&&h[0]===P&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function o(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,c,d){for(var e=0,f=c.length;f>e;e++)b(a,c[e],d);return d}function q(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function r(a,b,c,e,f,g){return e&&!e[N]&&(e=
r(e)),f&&!f[N]&&(f=r(f,g)),d(function(d,g,h,i){var j,k,l,m=[],n=[],o=g.length,r=d||p(b||"*",h.nodeType?[h]:h,[]),s=!a||!d&&b?r:q(r,m,a,h,i),t=c?f||(d?a:o||e)?[]:g:s;if(c&&c(s,t,h,i),e)for(j=q(t,n),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[n[k]]=!(s[n[k]]=l));if(d){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?bb.call(d,l):m[k])>-1&&(d[j]=!(g[j]=l))}}else t=q(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function s(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return bb.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==C)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=w.relative[a[h].type])k=[n(o(k),c)];else{if(c=w.filter[a[h].type].apply(null,a[h].matches),c[N]){for(d=++h;e>d&&!w.relative[a[d].type];d++);return r(h>1&&o(k),h>1&&m(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ib,"$1"),
c,d>h&&s(a.slice(h,d)),e>d&&s(a=a.slice(d)),e>d&&m(a))}k.push(c)}return o(k)}function t(a,c){var e=c.length>0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],r=[],s=C,t=d||f&&w.find.TAG("*",j),u=P+=null==s?1:Math.random()||.1,v=t.length;for(j&&(C=g!==G&&g);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0;m=a[l++];)if(m(k,g,h)){i.push(k);break}j&&(P=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,r,g,h);if(d){if(n>0)for(;o--;)p[o]||r[o]||(r[o]=Z.call(i));r=q(r)}_.apply(i,r),j&&!d&&r.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(P=u,C=s),p};return e?d(g):g}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P=0,Q=0,R=c(),S=c(),T=c(),U=function(a,b){return a===b&&(E=!0),0},V="undefined",W=1<<31,X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,ab=Y.slice,bb=Y.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},cb="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hid
den|ismap|loop|multiple|open|readonly|required|scoped",db="[\\x20\\t\\r\\n\\f]",eb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",fb=eb.replace("w","w#"),gb="\\["+db+"*("+eb+")(?:"+db+"*([*^$|!~]?=)"+db+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+fb+"))|)"+db+"*\\]",hb=":("+eb+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+gb+")*)|.*)\\)|)",ib=new RegExp("^"+db+"+|((?:^|[^\\\\])(?:\\\\.)*)"+db+"+$","g"),jb=new RegExp("^"+db+"*,"+db+"*"),kb=new RegExp("^"+db+"*([>+~]|"+db+")"+db+"*"),lb=new RegExp("="+db+"*([^\\]'\"]*?)"+db+"*\\]","g"),mb=new RegExp(hb),nb=new RegExp("^"+fb+"$"),ob={ID:new RegExp("^#("+eb+")"),CLASS:new RegExp("^\\.("+eb+")"),TAG:new RegExp("^("+eb.replace("w","w*")+")"),ATTR:new RegExp("^"+gb),PSEUDO:new RegExp("^"+hb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+db+"*(even|odd|(([+-]|)(\\d*)n|)"+db+"*(?:([+-]|)"+db+"*(\\d+)|))"+db+"*\\)|)","i"),bool:new RegExp("^(?:"+cb+")$","i"),needsContext:
new RegExp("^"+db+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+db+"*((?:-\\d)?\\d*)"+db+"*\\)|)(?=[^-]|$)","i")},pb=/^(?:input|select|textarea|button)$/i,qb=/^h\d$/i,rb=/^[^{]+\{\s*\[native \w/,sb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tb=/[+~]/,ub=/'|\\/g,vb=new RegExp("\\\\([\\da-f]{1,6}"+db+"?|("+db+")|.)","ig"),wb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{_.apply(Y=ab.call(O.childNodes),O.childNodes),Y[O.childNodes.length].nodeType}catch(xb){_={apply:Y.length?function(a,b){$.apply(a,ab.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}v=b.support={},y=b.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},F=b.setDocument=function(a){var b,c=a?a.ownerDocument||a:O,d=c.defaultView;return c!==G&&9===c.nodeType&&c.documentElement?(G=c,H=c.documentElement,I=!y(c),d&&d!==d.top&&(d.addEventListener?d.addEventListener("u
nload",function(){F()},!1):d.attachEvent&&d.attachEvent("onunload",function(){F()})),v.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),v.getElementsByTagName=e(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),v.getElementsByClassName=rb.test(c.getElementsByClassName)&&e(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),v.getById=e(function(a){return H.appendChild(a).id=N,!c.getElementsByName||!c.getElementsByName(N).length}),v.getById?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&I){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){return a.getAttribute("id")===b}}):(delete w.find.ID,w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b
}}),w.find.TAG=v.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.CLASS=v.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==V&&I?b.getElementsByClassName(a):void 0},K=[],J=[],(v.qsa=rb.test(c.querySelectorAll))&&(e(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&J.push("[*^$]="+db+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||J.push("\\["+db+"*(?:value|"+cb+")"),a.querySelectorAll(":checked").length||J.push(":checked")}),e(function(a){var b=c.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&J.push("name"+db+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||J.push(":enabled",
":disabled"),a.querySelectorAll("*,:x"),J.push(",.*:")})),(v.matchesSelector=rb.test(L=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&e(function(a){v.disconnectedMatch=L.call(a,"div"),L.call(a,"[s!='']:x"),K.push("!=",hb)}),J=J.length&&new RegExp(J.join("|")),K=K.length&&new RegExp(K.join("|")),b=rb.test(H.compareDocumentPosition),M=b||rb.test(H.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=b?function(a,b){if(a===b)return E=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!v.sortDetached&&b.compareDocumentPosition(a)===d?a===c||a.ownerDocument===O&&M(O,a)?-1:b===c||b.ownerDocument===O&&M(O,b)?1
:D?bb.call(D,a)-bb.call(D,b):0:4&d?-1:1)}:function(a,b){if(a===b)return E=!0,0;var d,e=0,f=a.parentNode,h=b.parentNode,i=[a],j=[b];if(!f||!h)return a===c?-1:b===c?1:f?-1:h?1:D?bb.call(D,a)-bb.call(D,b):0;if(f===h)return g(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?g(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},c):G},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if((a.ownerDocument||a)!==G&&F(a),c=c.replace(lb,"='$1']"),!(!v.matchesSelector||!I||K&&K.test(c)||J&&J.test(c)))try{var d=L.call(a,c);if(d||v.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return b(c,G,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!==G&&F(a),M(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!==G&&F(a);var c=w.attrHandle[b.toLowerCase()],d=c&&X.call(w.attrHandle,b.toLowerCase())?c(a,b,!I):void 0;return void 0!==d?d:v.attributes||!I?a.getAttribute(b):(d=a.getAttribut
eNode(b))&&d.specified?d.value:null},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(E=!v.detectDuplicates,D=!v.sortStable&&a.slice(0),a.sort(U),E){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return D=null,a},x=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=x(b);return c},w=b.selectors={cacheLength:50,createPseudo:d,match:ob,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(vb,wb),a[3]=(a[3]||a[4]||a[5]||"").replace(vb,wb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice
(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return ob.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&mb.test(c)&&(b=z(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(vb,wb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=R[a+" "];return b||(b=new RegExp("(^|"+db+")"+a+"("+db+"|$)"))&&R(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:c?(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f+" ").indexOf(d)>-1:"|="===
c?f===d||f.slice(0,d.length+1)===d+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===P&&j[1],m=j[0]===P&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[P,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===P)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[P,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,c){var e,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||b.error("unsuppo
rted pseudo: "+a);return f[N]?f(c):f.length>1?(e=[a,a,"",c],w.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=bb.call(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=A(a.replace(ib,"$1"));return e[N]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:d(function(a){return nb.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(vb,wb).toLowerCase(),function(b){var c;do if(c=I?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},r
oot:function(a){return a===H},focus:function(a){return a===G.activeElement&&(!G.hasFocus||G.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return qb.test(a.nodeName)},input:function(a){return pb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:j(function(){return[0]}),last:j(function(a,b){return[b-1]}),eq:j(function(a,b,c){return[0>c?
c+b:c]}),even:j(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:j(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:j(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:j(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},w.pseudos.nth=w.pseudos.eq;for(u in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[u]=h(u);for(u in{submit:!0,reset:!0})w.pseudos[u]=i(u);return l.prototype=w.filters=w.pseudos,w.setFilters=new l,z=b.tokenize=function(a,c){var d,e,f,g,h,i,j,k=S[a+" "];if(k)return c?0:k.slice(0);for(h=a,i=[],j=w.preFilter;h;){(!d||(e=jb.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),d=!1,(e=kb.exec(h))&&(d=e.shift(),f.push({value:d,type:e[0].replace(ib," ")}),h=h.slice(d.length));for(g in w.filter)!(e=ob[g].exec(h))||j[g]&&!(e=j[g](e))||(d=e.shift(),f.push({value:d,type:g,matches:e}),h=h.slice(d.length));if(!d)break}return c?h.length:h?b.error(a):S(a,i).slice(0)},A=b.compile=function(a,b){var c,d=[],e=[],f=
T[a+" "];if(!f){for(b||(b=z(a)),c=b.length;c--;)f=s(b[c]),f[N]?d.push(f):e.push(f);f=T(a,t(e,d)),f.selector=a}return f},B=b.select=function(a,b,c,d){var e,f,g,h,i,j="function"==typeof a&&a,l=!d&&z(a=j.selector||a);if(c=c||[],1===l.length){if(f=l[0]=l[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&v.getById&&9===b.nodeType&&I&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(vb,wb),b)||[])[0],!b)return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=ob.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(vb,wb),tb.test(f[0].type)&&k(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return _.apply(c,d),c;break}}return(j||A(a,l))(d,b,!I,c,tb.test(a)&&k(b.parentNode)||b),c},v.sortStable=N.split("").sort(U).join("")===N,v.detectDuplicates=!!E,F(),v.sortDetached=e(function(a){return 1&a.compareDocumentPosition(G.createElement("div"))}),e(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firs
tChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),v.attributes&&e(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(cb,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);_.find=eb,_.expr=eb.selectors,_.expr[":"]=_.expr.pseudos,_.unique=eb.uniqueSort,_.text=eb.getText,_.isXMLDoc=eb.isXML,_.contains=eb.contains;var fb=_.expr.match.needsContext,gb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,hb=/^.[^:#\[\.,]*$/;_.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?_.find.matchesSelector(d,a)?[d]:[]:_.find.matches(a,_.grep(b,function(a){return 1===a.nodeType}))},_.fn.extend({find:fu
nction(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(_(a).filter(function(){for(b=0;c>b;b++)if(_.contains(e[b],this))return!0
+}));for(b=0;c>b;b++)_.find(a,e[b],d);return d=this.pushStack(c>1?_.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(d(this,a||[],!1))},not:function(a){return this.pushStack(d(this,a||[],!0))},is:function(a){return!!d(this,"string"==typeof a&&fb.test(a)?_(a):a||[],!1).length}});var ib,jb=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,kb=_.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:jb.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||ib).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof _?b[0]:b,_.merge(this,_.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:Z,!0)),gb.test(c[1])&&_.isPlainObject(b))for(c in b)_.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=Z.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=Z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this)
:_.isFunction(a)?"undefined"!=typeof ib.ready?ib.ready(a):a(_):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),_.makeArray(a,this))};kb.prototype=_.fn,ib=_(Z);var lb=/^(?:parents|prev(?:Until|All))/,mb={children:!0,contents:!0,next:!0,prev:!0};_.extend({dir:function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&_(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),_.fn.extend({has:function(a){var b=_(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(_.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=fb.test(a)||"string"!=typeof a?_(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&_.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?_.unique(f):f)},index:function(a){return a?"string"==type
of a?U.call(_(a),this[0]):U.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(_.unique(_.merge(this.get(),_(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),_.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return _.dir(a,"parentNode")},parentsUntil:function(a,b,c){return _.dir(a,"parentNode",c)},next:function(a){return e(a,"nextSibling")},prev:function(a){return e(a,"previousSibling")},nextAll:function(a){return _.dir(a,"nextSibling")},prevAll:function(a){return _.dir(a,"previousSibling")},nextUntil:function(a,b,c){return _.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return _.dir(a,"previousSibling",c)},siblings:function(a){return _.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return _.sibling(a.firstChild)},contents:function(a){return a.contentDocument||_.merge([],a.childNodes)}},f
unction(a,b){_.fn[a]=function(c,d){var e=_.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=_.filter(d,e)),this.length>1&&(mb[a]||_.unique(e),lb.test(a)&&e.reverse()),this.pushStack(e)}});var nb=/\S+/g,ob={};_.Callbacks=function(a){a="string"==typeof a?ob[a]||f(a):_.extend({},a);var b,c,d,e,g,h,i=[],j=!a.once&&[],k=function(f){for(b=a.memory&&f,c=!0,h=e||0,e=0,g=i.length,d=!0;i&&g>h;h++)if(i[h].apply(f[0],f[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,i&&(j?j.length&&k(j.shift()):b?i=[]:l.disable())},l={add:function(){if(i){var c=i.length;!function f(b){_.each(b,function(b,c){var d=_.type(c);"function"===d?a.unique&&l.has(c)||i.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),d?g=i.length:b&&(e=c,k(b))}return this},remove:function(){return i&&_.each(arguments,function(a,b){for(var c;(c=_.inArray(b,i,c))>-1;)i.splice(c,1),d&&(g>=c&&g--,h>=c&&h--)}),this},has:function(a){return a?_.inArray(a,i)>-1:!(!i||!i.length)},empty:function(){return i=[],g=0,this},disa
ble:function(){return i=j=b=void 0,this},disabled:function(){return!i},lock:function(){return j=void 0,b||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return!i||c&&!j||(b=b||[],b=[a,b.slice?b.slice():b],d?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!c}};return l},_.extend({Deferred:function(a){var b=[["resolve","done",_.Callbacks("once memory"),"resolved"],["reject","fail",_.Callbacks("once memory"),"rejected"],["notify","progress",_.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return _.Deferred(function(c){_.each(b,function(b,f){var g=_.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&_.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:f
unction(a){return null!=a?_.extend(a,d):d}},e={};return d.pipe=d.then,_.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b,c,d,e=0,f=R.call(arguments),g=f.length,h=1!==g||a&&_.isFunction(a.promise)?g:0,i=1===h?a:_.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?R.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);g>e;e++)f[e]&&_.isFunction(f[e].promise)?f[e].promise().done(j(e,d,f)).fail(i.reject).progress(j(e,c,b)):--h;return h||i.resolveWith(d,f),i.promise()}});var pb;_.fn.ready=function(a){return _.ready.promise().done(a),this},_.extend({isReady:!1,readyWait:1,holdReady:function(a){a?_.readyWait++:_.ready(!0)},ready:function(a){(a===!0?--_.readyWait:_.isReady)||(_
.isReady=!0,a!==!0&&--_.readyWait>0||(pb.resolveWith(Z,[_]),_.fn.triggerHandler&&(_(Z).triggerHandler("ready"),_(Z).off("ready"))))}}),_.ready.promise=function(b){return pb||(pb=_.Deferred(),"complete"===Z.readyState?setTimeout(_.ready):(Z.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1))),pb.promise(b)},_.ready.promise();var qb=_.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===_.type(c)){e=!0;for(h in c)_.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,_.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(_(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};_.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType},h.uid=1,h.accepts=_.acceptData,h.prototype={key:function(a){if(!h.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=h.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=
c,_.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(_.isEmptyObject(f))_.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,_.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{_.isArray(b)?d=b.concat(b.map(_.camelCase)):(e=_.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(nb)||[])),c=d.length;for(;c--;)delete g[d[c]]}},hasData:function(a){return!_.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var rb=new h,sb=new h,tb=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ub=/([A-Z])/g;_.extend({hasData:function(a){return sb.hasD
ata(a)||rb.hasData(a)},data:function(a,b,c){return sb.access(a,b,c)},removeData:function(a,b){sb.remove(a,b)},_data:function(a,b,c){return rb.access(a,b,c)},_removeData:function(a,b){rb.remove(a,b)}}),_.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=sb.get(f),1===f.nodeType&&!rb.get(f,"hasDataAttrs"))){for(c=g.length;c--;)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=_.camelCase(d.slice(5)),i(f,d,e[d])));rb.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){sb.set(this,a)}):qb(this,function(b){var c,d=_.camelCase(a);if(f&&void 0===b){if(c=sb.get(f,a),void 0!==c)return c;if(c=sb.get(f,d),void 0!==c)return c;if(c=i(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=sb.get(this,d);sb.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&sb.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){sb.remove(this,a)})}}),_.extend({queue:function(a,b,c){v
ar d;return a?(b=(b||"fx")+"queue",d=rb.get(a,b),c&&(!d||_.isArray(c)?d=rb.access(a,b,_.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=_.queue(a,b),d=c.length,e=c.shift(),f=_._queueHooks(a,b),g=function(){_.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return rb.get(a,c)||rb.access(a,c,{empty:_.Callbacks("once memory").add(function(){rb.remove(a,[b+"queue",c])})})}}),_.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?_.queue(this[0],a):void 0===b?this:this.each(function(){var c=_.queue(this,a,b);_._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&_.dequeue(this,a)})},dequeue:function(a){return this.each(function(){_.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=_.Deferred(),f=this,g=this.length,h=funct
ion(){--d||e.resolveWith(f,[f])};for("string"!=typeof a&&(b=a,a=void 0),a=a||"fx";g--;)c=rb.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var vb=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,wb=["Top","Right","Bottom","Left"],xb=function(a,b){return a=b||a,"none"===_.css(a,"display")||!_.contains(a.ownerDocument,a)},yb=/^(?:checkbox|radio)$/i;!function(){var a=Z.createDocumentFragment(),b=a.appendChild(Z.createElement("div")),c=Z.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),Y.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",Y.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var zb="undefined";Y.focusinBubbles="onfocusin"in a;var Ab=/^key/,Bb=/^(?:mouse|pointer|contextmenu)|click/,Cb=/^(?:focusinfocus|focusoutblur)$/,Db=/^([^.]*)(?:\.(.+)|)$/;_.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,
m,n,o,p,q=rb.get(a);if(q)for(c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=_.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return typeof _!==zb&&_.event.triggered!==b.type?_.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(nb)||[""],j=b.length;j--;)h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=_.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=_.event.special[n]||{},k=_.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&_.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),_.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=rb.hasData(a)&&rb.get(a);if(q&&(i=q.events)){for(b=(b||"").match(nb)||[""],j=b.length;j--;
)if(h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=_.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||_.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)_.event.remove(a,n+b[j],c,d,!0);_.isEmptyObject(i)&&(delete q.handle,rb.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m=[d||Z],n=X.call(b,"type")?b.type:b,o=X.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||Z,3!==d.nodeType&&8!==d.nodeType&&!Cb.test(n+_.event.triggered)&&(n.indexOf(".")>=0&&(o=n.split("."),n=o.shift(),o.sort()),j=n.indexOf(":")<0&&"on"+n,b=b[_.expando]?b:new _.Event(n,"object"==typeof b&&b),b.isTrigger=e?2:3,b.n
amespace=o.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:_.makeArray(c,[b]),l=_.event.special[n]||{},e||!l.trigger||l.trigger.apply(d,c)!==!1)){if(!e&&!l.noBubble&&!_.isWindow(d)){for(i=l.delegateType||n,Cb.test(i+n)||(g=g.parentNode);g;g=g.parentNode)m.push(g),h=g;h===(d.ownerDocument||Z)&&m.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=m[f++])&&!b.isPropagationStopped();)b.type=f>1?i:l.bindType||n,k=(rb.get(g,"events")||{})[b.type]&&rb.get(g,"handle"),k&&k.apply(g,c),k=j&&g[j],k&&k.apply&&_.acceptData(g)&&(b.result=k.apply(g,c),b.result===!1&&b.preventDefault());return b.type=n,e||b.isDefaultPrevented()||l._default&&l._default.apply(m.pop(),c)!==!1||!_.acceptData(d)||j&&_.isFunction(d[n])&&!_.isWindow(d)&&(h=d[j],h&&(d[j]=null),_.event.triggered=n,d[n](),_.event.triggered=void 0,h&&(d[j]=h)),b.result}},dispatch:function(a){a=_.event.fix(a);var b,c,d,e,f,g=[],h=R.call(argume
nts),i=(rb.get(this,"events")||{})[a.type]||[],j=_.event.special[a.type]||{};if(h[0]=a,a.delegateTarget=this,!j.preDispatch||j.preDispatch.call(this,a)!==!1){for(g=_.event.handlers.call(this,a,i),b=0;(e=g[b++])&&!a.isPropagationStopped();)for(a.currentTarget=e.elem,c=0;(f=e.handlers[c++])&&!a.isImmediatePropagationStopped();)(!a.namespace_re||a.namespace_re.test(f.namespace))&&(a.handleObj=f,a.data=f.data,d=((_.event.special[f.origType]||{}).handle||f.handler).apply(e.elem,h),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return j.postDispatch&&j.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?_(e,this).index(i)>=0:_.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}re
turn h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||Z,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[_.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];for(g||(this.fixHooks[e]=g=Bb.test(e)?this.mouseHooks:Ab.tes
t(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new _.Event(f),b=d.length;b--;)c=d[b],a[c]=f[c];return a.target||(a.target=Z),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==l()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===l()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&_.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return _.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=_.extend(new _.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?_.event.trigger(e,null,b):_.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},_.removeEvent=function(a,b,c){a.removeE
ventListener&&a.removeEventListener(b,c,!1)},_.Event=function(a,b){return this instanceof _.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?j:k):this.type=a,b&&_.extend(this,b),this.timeStamp=a&&a.timeStamp||_.now(),void(this[_.expando]=!0)):new _.Event(a,b)},_.Event.prototype={isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=j,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=j,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=j,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},_.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,
b){_.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!_.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),Y.focusinBubbles||_.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){_.event.simulate(b,a.target,_.event.fix(a),!0)};_.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=rb.access(d,b);e||d.addEventListener(a,c,!0),rb.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=rb.access(d,b)-1;e?rb.access(d,b,e):(d.removeEventListener(a,c,!0),rb.remove(d,b))}}}),_.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=k;else if(!d)return this;return 1===e&&(f=d,d=function(a){return _().off(a),f.apply(this,arguments)
},d.guid=f.guid||(f.guid=_.guid++)),this.each(function(){_.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,_(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=k),this.each(function(){_.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){_.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?_.event.trigger(a,b,c,!0):void 0}});var Eb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Fb=/<([\w:]+)/,Gb=/<|&#?\w+;/,Hb=/<(?:script|style|link)/i,Ib=/checked\s*(?:[^=]|=\s*.checked.)/i,Jb=/^$|\/(?:java|ecma)script/i,Kb=/^true\/(.*)/,Lb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Mb={option:[1,"<select multiple='multiple'>","</selec
t>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Mb.optgroup=Mb.option,Mb.tbody=Mb.tfoot=Mb.colgroup=Mb.caption=Mb.thead,Mb.th=Mb.td,_.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=_.contains(a.ownerDocument,a);if(!(Y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||_.isXMLDoc(a)))for(g=r(h),f=r(a),d=0,e=f.length;e>d;d++)s(f[d],g[d]);if(b)if(c)for(f=f||r(a),g=g||r(h),d=0,e=f.length;e>d;d++)q(f[d],g[d]);else q(a,h);return g=r(h,"script"),g.length>0&&p(g,!i&&r(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===_.type(e))_.merge(l,e.nodeType?[e]:e);else if(Gb.test(e)){for(f=f||k.appendChild(b.createElement("div")),g=(Fb.exec(e)||["",""])[1].toLowerCase(),h=Mb[g]||Mb._default,f.innerHTML=h[1]+e.replace(Eb,"<$1></$2>"
)+h[2],j=h[0];j--;)f=f.lastChild;_.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));for(k.textContent="",m=0;e=l[m++];)if((!d||-1===_.inArray(e,d))&&(i=_.contains(e.ownerDocument,e),f=r(k.appendChild(e),"script"),i&&p(f),c))for(j=0;e=f[j++];)Jb.test(e.type||"")&&c.push(e);return k},cleanData:function(a){for(var b,c,d,e,f=_.event.special,g=0;void 0!==(c=a[g]);g++){if(_.acceptData(c)&&(e=c[rb.expando],e&&(b=rb.cache[e]))){if(b.events)for(d in b.events)f[d]?_.event.remove(c,d):_.removeEvent(c,d,b.handle);rb.cache[e]&&delete rb.cache[e]}delete sb.cache[c[sb.expando]]}}}),_.fn.extend({text:function(a){return qb(this,function(a){return void 0===a?_.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.appendChild(a)}})}
,prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?_.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||_.cleanData(r(c)),c.parentNode&&(b&&_.contains(c.ownerDocument,c)&&p(r(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(_.cleanData(r(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return _.clone(this,a,b)})},html:function(a){return qb(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.inner
HTML;if("string"==typeof a&&!Hb.test(a)&&!Mb[(Fb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Eb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(_.cleanData(r(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,_.cleanData(r(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=S.apply([],a);var c,d,e,f,g,h,i=0,j=this.length,k=this,l=j-1,m=a[0],p=_.isFunction(m);if(p||j>1&&"string"==typeof m&&!Y.checkClone&&Ib.test(m))return this.each(function(c){var d=k.eq(c);p&&(a[0]=m.call(this,c,d.html())),d.domManip(a,b)});if(j&&(c=_.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(e=_.map(r(c,"script"),n),f=e.length;j>i;i++)g=c,i!==l&&(g=_.clone(g,!0,!0),f&&_.merge(e,r(g,"script"))),b.call(th
is[i],g,i);if(f)for(h=e[e.length-1].ownerDocument,_.map(e,o),i=0;f>i;i++)g=e[i],Jb.test(g.type||"")&&!rb.access(g,"globalEval")&&_.contains(h,g)&&(g.src?_._evalUrl&&_._evalUrl(g.src):_.globalEval(g.textContent.replace(Lb,"")))}return this}}),_.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){_.fn[a]=function(a){for(var c,d=[],e=_(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),_(e[g])[b](c),T.apply(d,c.get());return this.pushStack(d)}});var Nb,Ob={},Pb=/^margin/,Qb=new RegExp("^("+vb+")(?!px)[a-z%]+$","i"),Rb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};!function(){function b(){g.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",g.innerHTML="",e.appendChild(f);var b=a.getComputedStyle(g,null);c="1%"!==b.top,d="4px"===b.width,e.removeChild(f)}
var c,d,e=Z.documentElement,f=Z.createElement("div"),g=Z.createElement("div");g.style&&(g.style.backgroundClip="content-box",g.cloneNode(!0).style.backgroundClip="",Y.clearCloneStyle="content-box"===g.style.backgroundClip,f.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",f.appendChild(g),a.getComputedStyle&&_.extend(Y,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return null==d&&b(),d},reliableMarginRight:function(){var b,c=g.appendChild(Z.createElement("div"));return c.style.cssText=g.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",g.style.width="1px",e.appendChild(f),b=!parseFloat(a.getComputedStyle(c,null).marginRight),e.removeChild(f),b}}))}(),_.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var S
b=/^(none|table(?!-c[ea]).+)/,Tb=new RegExp("^("+vb+")(.*)$","i"),Ub=new RegExp("^([+-])=("+vb+")","i"),Vb={position:"absolute",visibility:"hidden",display:"block"},Wb={letterSpacing:"0",fontWeight:"400"},Xb=["Webkit","O","Moz","ms"];_.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=v(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=_.camelCase(b),i=a.style;return b=_.cssProps[h]||(_.cssProps[h]=x(i,h)),g=_.cssHooks[b]||_.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ub.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(_.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||_.cssNumber[h]||(c+="px"),Y.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g
&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=_.camelCase(b);return b=_.cssProps[h]||(_.cssProps[h]=x(a.style,h)),g=_.cssHooks[b]||_.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=v(a,b,d)),"normal"===e&&b in Wb&&(e=Wb[b]),""===c||c?(f=parseFloat(e),c===!0||_.isNumeric(f)?f||0:e):e}}),_.each(["height","width"],function(a,b){_.cssHooks[b]={get:function(a,c,d){return c?Sb.test(_.css(a,"display"))&&0===a.offsetWidth?_.swap(a,Vb,function(){return A(a,b,d)}):A(a,b,d):void 0},set:function(a,c,d){var e=d&&Rb(a);return y(a,c,d?z(a,b,d,"border-box"===_.css(a,"boxSizing",!1,e),e):0)}}}),_.cssHooks.marginRight=w(Y.reliableMarginRight,function(a,b){return b?_.swap(a,{display:"inline-block"},v,[a,"marginRight"]):void 0}),_.each({margin:"",padding:"",border:"Width"},function(a,b){_.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+wb[d]+b]=f[d]||f[d-2]||f[0];return e}},Pb.test(a)||(_.cssHooks[a+b].
set=y)}),_.fn.extend({css:function(a,b){return qb(this,function(a,b,c){var d,e,f={},g=0;if(_.isArray(b)){for(d=Rb(a),e=b.length;e>g;g++)f[b[g]]=_.css(a,b[g],!1,d);return f}return void 0!==c?_.style(a,b,c):_.css(a,b)},a,b,arguments.length>1)},show:function(){return B(this,!0)},hide:function(){return B(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){xb(this)?_(this).show():_(this).hide()})}}),_.Tween=C,C.prototype={constructor:C,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(_.cssNumber[c]?"":"px")},cur:function(){var a=C.propHooks[this.prop];return a&&a.get?a.get(this):C.propHooks._default.get(this)},run:function(a){var b,c=C.propHooks[this.prop];return this.pos=b=this.options.duration?_.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.s
tep.call(this.elem,this.now,this),c&&c.set?c.set(this):C.propHooks._default.set(this),this}},C.prototype.init.prototype=C.prototype,C.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=_.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){_.fx.step[a.prop]?_.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[_.cssProps[a.prop]]||_.cssHooks[a.prop])?_.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},C.propHooks.scrollTop=C.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},_.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},_.fx=C.prototype.init,_.fx.step={};var Yb,Zb,$b=/^(?:toggle|show|hide)$/,_b=new RegExp("^(?:([+-])=|)("+vb+")([a-z%]*)$","i"),ac=/queueHooks$/,bc=[G],cc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=_b.exec(b),f=e&&e[3]||(_.cssNumber[a]?"":"px"),g=(_.cssNumber[a]||"px"!=
=f&&+d)&&_b.exec(_.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,_.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};_.Animation=_.extend(I,{tweener:function(a,b){_.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],cc[c]=cc[c]||[],cc[c].unshift(b)},prefilter:function(a,b){b?bc.unshift(a):bc.push(a)}}),_.speed=function(a,b,c){var d=a&&"object"==typeof a?_.extend({},a):{complete:c||!c&&b||_.isFunction(a)&&a,duration:a,easing:c&&b||b&&!_.isFunction(b)&&b};return d.duration=_.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in _.fx.speeds?_.fx.speeds[d.duration]:_.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){_.isFunction(d.old)&&d.old.call(this),d.queue&&_.dequeue(this,d.queue)},d},_.fn.extend({fadeTo:function(a,b,c,d){return this.filter(xb).css("opacity",0).show()
.end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=_.isEmptyObject(a),f=_.speed(b,c,d),g=function(){var b=I(this,_.extend({},a),f);(e||rb.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=_.timers,g=rb.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ac.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&_.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=rb.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=_.timers,g=d?d.length:0;for(c.finish=!0,_.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.spli
ce(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),_.each(["toggle","show","hide"],function(a,b){var c=_.fn[b];
+_.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(E(b,!0),a,d,e)}}),_.each({slideDown:E("show"),slideUp:E("hide"),slideToggle:E("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){_.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),_.timers=[],_.fx.tick=function(){var a,b=0,c=_.timers;for(Yb=_.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||_.fx.stop(),Yb=void 0},_.fx.timer=function(a){_.timers.push(a),a()?_.fx.start():_.timers.pop()},_.fx.interval=13,_.fx.start=function(){Zb||(Zb=setInterval(_.fx.tick,_.fx.interval))},_.fx.stop=function(){clearInterval(Zb),Zb=null},_.fx.speeds={slow:600,fast:200,_default:400},_.fn.delay=function(a,b){return a=_.fx?_.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=Z.createElement("input"),b=Z.createElement("select"),c=b.appendChild(Z.createEleme
nt("option"));a.type="checkbox",Y.checkOn=""!==a.value,Y.optSelected=c.selected,b.disabled=!0,Y.optDisabled=!c.disabled,a=Z.createElement("input"),a.value="t",a.type="radio",Y.radioValue="t"===a.value}();var dc,ec,fc=_.expr.attrHandle;_.fn.extend({attr:function(a,b){return qb(this,_.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){_.removeAttr(this,a)})}}),_.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===zb?_.prop(a,b,c):(1===f&&_.isXMLDoc(a)||(b=b.toLowerCase(),d=_.attrHooks[b]||(_.expr.match.bool.test(b)?ec:dc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=_.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void _.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(nb);if(f&&1===a.nodeType)for(;c=f[e++];)d=_.propFix[c]||c,_.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:functio
n(a,b){if(!Y.radioValue&&"radio"===b&&_.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),ec={set:function(a,b,c){return b===!1?_.removeAttr(a,c):a.setAttribute(c,c),c}},_.each(_.expr.match.bool.source.match(/\w+/g),function(a,b){var c=fc[b]||_.find.attr;fc[b]=function(a,b,d){var e,f;return d||(f=fc[b],fc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,fc[b]=f),e}});var gc=/^(?:input|select|textarea|button)$/i;_.fn.extend({prop:function(a,b){return qb(this,_.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[_.propFix[a]||a]})}}),_.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!_.isXMLDoc(a),f&&(b=_.propFix[b]||b,e=_.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||gc.test(a.n
odeName)||a.href?a.tabIndex:-1}}}}),Y.optSelected||(_.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),_.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){_.propFix[this.toLowerCase()]=this});var hc=/[\t\r\n\f]/g;_.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):" ")){for(f=0;e=b[f++];)d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=_.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).removeClass(a.call(this,b,this.classNa
me))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):"")){for(f=0;e=b[f++];)for(;d.indexOf(" "+e+" ")>=0;)d=d.replace(" "+e+" "," ");g=a?_.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(_.isFunction(a)?function(c){_(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c)for(var b,d=0,e=_(this),f=a.match(nb)||[];b=f[d++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else(c===zb||"boolean"===c)&&(this.className&&rb.set(this,"__className__",this.className),this.className=this.className||a===!1?"":rb.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(hc," ").indexOf(b)>=0)return!0;return!1}});var ic=/\r/g;_.fn.extend({val:function(a){var b
,c,d,e=this[0];{if(arguments.length)return d=_.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,_(this).val()):a,null==e?e="":"number"==typeof e?e+="":_.isArray(e)&&(e=_.map(e,function(a){return null==a?"":a+""})),b=_.valHooks[this.type]||_.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=_.valHooks[e.type]||_.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ic,""):null==c?"":c)}}}),_.extend({valHooks:{option:{get:function(a){var b=_.find.attr(a,"value");return null!=b?b:_.trim(_.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(Y.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&_.nodeName(c.parentNode,"optgroup"))){if(b=_(c).val(),f)return b;g.p
ush(b)}return g},set:function(a,b){for(var c,d,e=a.options,f=_.makeArray(b),g=e.length;g--;)d=e[g],(d.selected=_.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),_.each(["radio","checkbox"],function(){_.valHooks[this]={set:function(a,b){return _.isArray(b)?a.checked=_.inArray(_(a).val(),b)>=0:void 0}},Y.checkOn||(_.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),_.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){_.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),_.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){
return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var jc=_.now(),kc=/\?/;_.parseJSON=function(a){return JSON.parse(a+"")},_.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&_.error("Invalid XML: "+a),b};var lc,mc,nc=/#.*$/,oc=/([?&])_=[^&]*/,pc=/^(.*?):[ \t]*([^\r\n]*)$/gm,qc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rc=/^(?:GET|HEAD)$/,sc=/^\/\//,tc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,uc={},vc={},wc="*/".concat("*");try{mc=location.href}catch(xc){mc=Z.createElement("a"),mc.href="",mc=mc.href}lc=tc.exec(mc.toLowerCase())||[],_.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:mc,type:"GET",isLocal:qc.test(lc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":wc,text:"text/plain",html:"text/html",xml:"appli
cation/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":_.parseJSON,"text xml":_.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?L(L(a,_.ajaxSettings),b):L(_.ajaxSettings,a)},ajaxPrefilter:J(uc),ajaxTransport:J(vc),ajax:function(a,b){function c(a,b,c,g){var i,k,r,s,u,w=b;2!==t&&(t=2,h&&clearTimeout(h),d=void 0,f=g||"",v.readyState=a>0?4:0,i=a>=200&&300>a||304===a,c&&(s=M(l,v,c)),s=N(l,s,v,i),i?(l.ifModified&&(u=v.getResponseHeader("Last-Modified"),u&&(_.lastModified[e]=u),u=v.getResponseHeader("etag"),u&&(_.etag[e]=u)),204===a||"HEAD"===l.type?w="nocontent":304===a?w="notmodified":(w=s.state,k=s.data,r=s.error,i=!r)):(r=w,(a||!w)&&(w="error",0>a&&(a=0))),v.status=a,v.statusText=(b||w)+"",i?o.resolveWith(m,[k,w,v]):o.rejectWith(m,[v,w,r]),v.statusCode(q),q=void 0,j&&n.trigger(
i?"ajaxSuccess":"ajaxError",[v,l,i?k:r]),p.fireWith(m,[v,w]),j&&(n.trigger("ajaxComplete",[v,l]),--_.active||_.event.trigger("ajaxStop")))}"object"==typeof a&&(b=a,a=void 0),b=b||{};var d,e,f,g,h,i,j,k,l=_.ajaxSetup({},b),m=l.context||l,n=l.context&&(m.nodeType||m.jquery)?_(m):_.event,o=_.Deferred(),p=_.Callbacks("once memory"),q=l.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!g)for(g={};b=pc.exec(f);)g[b[1].toLowerCase()]=b[2];b=g[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return d&&d.abort(b),c(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,l.url=((a||l.url
||mc)+"").replace(nc,"").replace(sc,lc[1]+"//"),l.type=b.method||b.type||l.method||l.type,l.dataTypes=_.trim(l.dataType||"*").toLowerCase().match(nb)||[""],null==l.crossDomain&&(i=tc.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]===lc[1]&&i[2]===lc[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(lc[3]||("http:"===lc[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=_.param(l.data,l.traditional)),K(uc,l,b,v),2===t)return v;j=l.global,j&&0===_.active++&&_.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!rc.test(l.type),e=l.url,l.hasContent||(l.data&&(e=l.url+=(kc.test(e)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=oc.test(e)?e.replace(oc,"$1_="+jc++):e+(kc.test(e)?"&":"?")+"_="+jc++)),l.ifModified&&(_.lastModified[e]&&v.setRequestHeader("If-Modified-Since",_.lastModified[e]),_.etag[e]&&v.setRequestHeader("If-None-Match",_.etag[e])),(l.data&&l.hasContent&&l.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",l.contentTy
pe),v.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+wc+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)v.setRequestHeader(k,l.headers[k]);if(l.beforeSend&&(l.beforeSend.call(m,v,l)===!1||2===t))return v.abort();u="abort";for(k in{success:1,error:1,complete:1})v[k](l[k]);if(d=K(vc,l,b,v)){v.readyState=1,j&&n.trigger("ajaxSend",[v,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){v.abort("timeout")},l.timeout));try{t=1,d.send(r,c)}catch(w){if(!(2>t))throw w;c(-1,w)}}else c(-1,"No Transport");return v},getJSON:function(a,b,c){return _.get(a,b,c,"json")},getScript:function(a,b){return _.get(a,void 0,b,"script")}}),_.each(["get","post"],function(a,b){_[b]=function(a,c,d,e){return _.isFunction(c)&&(e=e||d,d=c,c=void 0),_.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){_.fn[b]=function(a){return this.on(b,a)}}),_
._evalUrl=function(a){return _.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},_.fn.extend({wrapAll:function(a){var b;return _.isFunction(a)?this.each(function(b){_(this).wrapAll(a.call(this,b))}):(this[0]&&(b=_(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(_.isFunction(a)?function(b){_(this).wrapInner(a.call(this,b))}:function(){var b=_(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=_.isFunction(a);return this.each(function(c){_(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){_.nodeName(this,"body")||_(this).replaceWith(this.childNodes)}).end()}}),_.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},_.expr.filters.visible=function(a){return!_.expr.filters.hidden(a)};var yc
=/%20/g,zc=/\[\]$/,Ac=/\r?\n/g,Bc=/^(?:submit|button|image|reset|file)$/i,Cc=/^(?:input|select|textarea|keygen)/i;_.param=function(a,b){var c,d=[],e=function(a,b){b=_.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=_.ajaxSettings&&_.ajaxSettings.traditional),_.isArray(a)||a.jquery&&!_.isPlainObject(a))_.each(a,function(){e(this.name,this.value)});else for(c in a)O(c,a[c],b,e);return d.join("&").replace(yc,"+")},_.fn.extend({serialize:function(){return _.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=_.prop(this,"elements");return a?_.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!_(this).is(":disabled")&&Cc.test(this.nodeName)&&!Bc.test(a)&&(this.checked||!yb.test(a))}).map(function(a,b){var c=_(this).val();return null==c?null:_.isArray(c)?_.map(c,function(a){return{name:b.name,value:a.replace(Ac,"\r\n")}}):{name:b.name,value:c.replace(Ac,"\r\n")}}).get()
}}),_.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Dc=0,Ec={},Fc={0:200,1223:204},Gc=_.ajaxSettings.xhr();a.ActiveXObject&&_(a).on("unload",function(){for(var a in Ec)Ec[a]()}),Y.cors=!!Gc&&"withCredentials"in Gc,Y.ajax=Gc=!!Gc,_.ajaxTransport(function(a){var b;return Y.cors||Gc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Dc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Ec[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Fc[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Ec[g]=b("abort");try{f.send(a.hasContent&&a
.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),_.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return _.globalEval(a),a}}}),_.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),_.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=_("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),Z.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Hc=[],Ic=/(=)\?(?=&|$)|\?\?/;_.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Hc.pop()||_.expando+"_"+jc++;return this[a]=!0,a}}),_.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ic.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("app
lication/x-www-form-urlencoded")&&Ic.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=_.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ic,"$1"+e):b.jsonp!==!1&&(b.url+=(kc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||_.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Hc.push(e)),g&&_.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),_.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||Z;var d=gb.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=_.buildFragment([a],b,e),e&&e.length&&_(e).remove(),_.merge([],d.childNodes))};var Jc=_.fn.load;_.fn.load=function(a,b,c){if("string"!=typeof a&&Jc)return Jc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=_.trim(a.slice(h)),a=a.slice(0,h)),_.isFunction(b)
?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&_.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?_("<div>").append(_.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},_.expr.filters.animated=function(a){return _.grep(_.timers,function(b){return a===b.elem}).length};var Kc=a.document.documentElement;_.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=_.css(a,"position"),l=_(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=_.css(a,"top"),i=_.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),_.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},_.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){_.offset.setOffset(this,a,b)});var b,c,d=t
his[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,_.contains(b,d)?(typeof d.getBoundingClientRect!==zb&&(e=d.getBoundingClientRect()),c=P(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===_.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),_.nodeName(a[0],"html")||(d=a.offset()),d.top+=_.css(a[0],"borderTopWidth",!0),d.left+=_.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-_.css(c,"marginTop",!0),left:b.left-d.left-_.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||Kc;a&&!_.nodeName(a,"html")&&"static"===_.css(a,"position");)a=a.offsetParent;return a||Kc})}}),_.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;_.fn[b]=function(e){return qb(this,function(b,e,f){var g=P(b);return void 0===f?g?g[c]:b[e]:void(
g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),_.each(["top","left"],function(a,b){_.cssHooks[b]=w(Y.pixelPosition,function(a,c){return c?(c=v(a,b),Qb.test(c)?_(a).position()[b]+"px":c):void 0})}),_.each({Height:"height",Width:"width"},function(a,b){_.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){_.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return qb(this,function(b,c,d){var e;return _.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?_.css(b,c,g):_.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),_.fn.size=function(){return this.length},_.fn.andSelf=_.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return _});var Lc=a.jQuery,Mc=a.$;return _.noConflict=function(b){return a.$===_&&(a.$=Mc),b&&a.jQuery
===_&&(a.jQuery=Lc),_},typeof b===zb&&(a.jQuery=a.$=_),_}),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.len
gth||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)
):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$elemen
t=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){
return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.ca
<TRUNCATED>
[25/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/application.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/application.js b/example/application/neoapp/webapp/src/main/webapp/scripts/application.js
new file mode 100644
index 0000000..d8cf6fe
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/application.js
@@ -0,0 +1,3 @@
+$(document).ready(function() {
+ /// here...
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG b/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG
new file mode 100644
index 0000000..b6907d1
Binary files /dev/null and b/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG differ
[08/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/ProcessorLookup.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/ProcessorLookup.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/ProcessorLookup.java
new file mode 100644
index 0000000..36c1920
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/ProcessorLookup.java
@@ -0,0 +1,256 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.processor;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeSet;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsersView;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.ErrorDetails;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.ErrorMessage;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.ErrorReference;
+import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
+import org.apache.isis.viewer.scimpi.dispatcher.view.History;
+import org.apache.isis.viewer.scimpi.dispatcher.view.VersionNumber;
+import org.apache.isis.viewer.scimpi.dispatcher.view.action.ActionButton;
+import org.apache.isis.viewer.scimpi.dispatcher.view.action.ActionForm;
+import org.apache.isis.viewer.scimpi.dispatcher.view.action.ActionLink;
+import org.apache.isis.viewer.scimpi.dispatcher.view.action.Methods;
+import org.apache.isis.viewer.scimpi.dispatcher.view.action.Parameter;
+import org.apache.isis.viewer.scimpi.dispatcher.view.action.RunAction;
+import org.apache.isis.viewer.scimpi.dispatcher.view.action.Services;
+import org.apache.isis.viewer.scimpi.dispatcher.view.collection.Collection;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.DebugAccessCheck;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.DebugCollectionView;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.DebugObjectView;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.DebuggerLink;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.Diagnostics;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.Log;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.LogLevel;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.Members;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.ShowDebug;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.Specification;
+import org.apache.isis.viewer.scimpi.dispatcher.view.debug.ThrowException;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.AddMessage;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.AddWarning;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.Errors;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.Feedback;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.FieldLabel;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.FieldValue;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.GetField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.IncludeObject;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.ListView;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.LongFormView;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.Messages;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.SelectedObject;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.ShortFormView;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableBuilder;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableCell;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableEmpty;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableHeader;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableRow;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableView;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.Title;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.Warnings;
+import org.apache.isis.viewer.scimpi.dispatcher.view.edit.EditObject;
+import org.apache.isis.viewer.scimpi.dispatcher.view.edit.FormEntry;
+import org.apache.isis.viewer.scimpi.dispatcher.view.edit.FormField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.edit.HiddenField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.edit.RadioListField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.edit.Selector;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.ExcludeField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.IncludeField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.logon.Logoff;
+import org.apache.isis.viewer.scimpi.dispatcher.view.logon.Logon;
+import org.apache.isis.viewer.scimpi.dispatcher.view.logon.RestrictAccess;
+import org.apache.isis.viewer.scimpi.dispatcher.view.logon.Secure;
+import org.apache.isis.viewer.scimpi.dispatcher.view.logon.User;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.BlockDefine;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.BlockUse;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Commit;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.ContentTag;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.CookieValue;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.DefaultValue;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.EditLink;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.EndSession;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Forward;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.GetCookie;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Import;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.InitializeFromCookie;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.InitializeFromResult;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Localization;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Mark;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.NewActionLink;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.ObjectLink;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.PageTitle;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Redirect;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.RemoveElement;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.ScopeTag;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SetCookie;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SetCookieFromField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SetFieldFromCookie;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SetLocalization;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SimpleButton;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.StartSession;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.TemplateTag;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Unless;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Variable;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.When;
+import org.apache.isis.viewer.scimpi.dispatcher.view.value.ActionName;
+import org.apache.isis.viewer.scimpi.dispatcher.view.value.CountElements;
+import org.apache.isis.viewer.scimpi.dispatcher.view.value.ElementType;
+import org.apache.isis.viewer.scimpi.dispatcher.view.value.FieldName;
+import org.apache.isis.viewer.scimpi.dispatcher.view.value.ParameterName;
+import org.apache.isis.viewer.scimpi.dispatcher.view.value.TitleString;
+import org.apache.isis.viewer.scimpi.dispatcher.view.value.Type;
+
+public class ProcessorLookup {
+ private final Map<String, ElementProcessor> swfElementProcessors = new HashMap<String, ElementProcessor>();
+
+ public void init() {
+ addElementProcessor(new ActionLink());
+ addElementProcessor(new ActionButton());
+ addElementProcessor(new ActionForm());
+ addElementProcessor(new ActionName());
+ addElementProcessor(new AddMessage());
+ addElementProcessor(new AddWarning());
+ addElementProcessor(new BlockDefine());
+ addElementProcessor(new BlockUse());
+ addElementProcessor(new History());
+ addElementProcessor(new Collection());
+ addElementProcessor(new Commit());
+ addElementProcessor(new ContentTag());
+ addElementProcessor(new CountElements());
+ addElementProcessor(new Diagnostics());
+ addElementProcessor(new DebugAccessCheck());
+ addElementProcessor(new DebugCollectionView());
+ addElementProcessor(new DebuggerLink());
+ addElementProcessor(new DebugObjectView());
+ addElementProcessor(new DebugUsersView());
+ addElementProcessor(new DefaultValue());
+ addElementProcessor(new EditLink());
+ addElementProcessor(new EditObject());
+ addElementProcessor(new ElementType());
+ addElementProcessor(new Errors());
+ addElementProcessor(new ErrorDetails());
+ addElementProcessor(new ErrorMessage());
+ addElementProcessor(new ErrorReference());
+ addElementProcessor(new ExcludeField());
+ addElementProcessor(new Feedback());
+ addElementProcessor(new FieldLabel());
+ addElementProcessor(new FieldName());
+ addElementProcessor(new FieldValue());
+ addElementProcessor(new FormField());
+ addElementProcessor(new FormEntry());
+ addElementProcessor(new Forward());
+ addElementProcessor(new GetField());
+ addElementProcessor(new HelpLink());
+ addElementProcessor(new HiddenField());
+ addElementProcessor(new Import());
+ addElementProcessor(new IncludeObject());
+ addElementProcessor(new IncludeField());
+ addElementProcessor(new InitializeFromCookie());
+ addElementProcessor(new InitializeFromResult());
+ addElementProcessor(new Log());
+ addElementProcessor(new LogLevel());
+ addElementProcessor(new Logon());
+ addElementProcessor(new Logoff());
+ addElementProcessor(new LongFormView());
+ addElementProcessor(new LinkField());
+ addElementProcessor(new ListView());
+ addElementProcessor(new NewActionLink());
+ addElementProcessor(new Mark());
+ addElementProcessor(new Members());
+ addElementProcessor(new Messages());
+ addElementProcessor(new Methods());
+ addElementProcessor(new ObjectLink());
+ addElementProcessor(new PageTitle());
+ addElementProcessor(new Parameter());
+ addElementProcessor(new ParameterName());
+ addElementProcessor(new RadioListField());
+ addElementProcessor(new Redirect());
+ addElementProcessor(new RemoveElement());
+ addElementProcessor(new VersionNumber());
+ addElementProcessor(new RunAction());
+ addElementProcessor(new RestrictAccess());
+ addElementProcessor(new ScopeTag());
+ addElementProcessor(new Secure());
+ addElementProcessor(new SelectedObject());
+ addElementProcessor(new Selector());
+ addElementProcessor(new Services());
+ addElementProcessor(new ShortFormView());
+ addElementProcessor(new ShowDebug());
+ addElementProcessor(new SimpleButton());
+ addElementProcessor(new Specification());
+ addElementProcessor(new TableCell());
+ addElementProcessor(new TableView());
+ addElementProcessor(new TableBuilder());
+ addElementProcessor(new TableEmpty());
+ addElementProcessor(new TableRow());
+ addElementProcessor(new TableHeader());
+ addElementProcessor(new TemplateTag());
+ addElementProcessor(new Title());
+ addElementProcessor(new TitleString());
+ addElementProcessor(new ThrowException());
+ addElementProcessor(new Type());
+ addElementProcessor(new User());
+ addElementProcessor(new Unless());
+ addElementProcessor(new Variable());
+ addElementProcessor(new Warnings());
+ addElementProcessor(new When());
+
+ addElementProcessor(new StartSession());
+ addElementProcessor(new EndSession());
+
+ addElementProcessor(new CookieValue());
+ addElementProcessor(new SetCookie());
+ addElementProcessor(new GetCookie());
+ addElementProcessor(new SetCookieFromField());
+ addElementProcessor(new SetFieldFromCookie());
+
+ // new, alpha, processors
+ addElementProcessor(new Localization());
+ addElementProcessor(new SetLocalization());
+ }
+
+ public void addElementProcessor(final ElementProcessor action) {
+ swfElementProcessors.put("SWF:" + action.getName().toUpperCase(), action);
+ }
+
+ public void debug(final DebugBuilder debug) {
+ debug.startSection("Recognised tags");
+ final Iterator<String> it2 = new TreeSet<String>(swfElementProcessors.keySet()).iterator();
+ while (it2.hasNext()) {
+ final String name = it2.next();
+ debug.appendln(name.toLowerCase(), swfElementProcessors.get(name));
+ }
+ debug.endSection();
+ }
+
+ public ElementProcessor getFor(final String name) {
+ return swfElementProcessors.get(name);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Request.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Request.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Request.java
new file mode 100644
index 0000000..118ff9b
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Request.java
@@ -0,0 +1,324 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.processor;
+
+import java.util.Stack;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
+import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.action.Attributes;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.view.HtmlSnippet;
+import org.apache.isis.viewer.scimpi.dispatcher.view.Snippet;
+import org.apache.isis.viewer.scimpi.dispatcher.view.SwfTag;
+
+public class Request implements PageWriter {
+
+ public class RepeatMarker {
+ private final int index;
+
+ private RepeatMarker(final int index) {
+ this.index = index;
+ }
+
+ public void repeat() {
+ Request.this.index = index;
+ }
+ }
+
+ private static Logger LOG = LoggerFactory.getLogger(Request.class);
+ public static final boolean ENSURE_VARIABLES_EXIST = true;
+ public static final boolean NO_VARIABLE_CHECKING = false;
+ private static Encoder encoder;
+
+ public static Encoder getEncoder() {
+ return encoder;
+ }
+
+ private final RequestContext context;
+ private final Stack<Snippet> snippets;
+ private final Stack<StringBuffer> buffers;
+ private final Stack<BlockContent> blocks;
+ private final ProcessorLookup processors;
+ private int nextFormId;
+ private int index = -1;
+ private final String path;
+
+ public Request(final String path, final RequestContext context, final Encoder encoder, final Stack<Snippet> snippets, final ProcessorLookup processors) {
+ this.path = path;
+ this.context = context;
+ Request.encoder = encoder;
+ this.snippets = snippets;
+ this.processors = processors;
+
+ buffers = new Stack<StringBuffer>();
+ blocks = new Stack<BlockContent>();
+ pushNewBuffer();
+ }
+
+ public void processNextTag() {
+ while (index < snippets.size() - 1) {
+ index++;
+ final Snippet snippet = snippets.get(index);
+ if (snippet instanceof HtmlSnippet) {
+ appendSnippet((HtmlSnippet) snippet);
+ } else {
+ final SwfTag tag = (SwfTag) snippet;
+ final String name = tag.getName();
+ final ElementProcessor processor = processors.getFor(name);
+ process(tag, processor);
+ if (context.isAborted()) {
+ return;
+ }
+ }
+ }
+ }
+
+ private void appendSnippet(final HtmlSnippet snippet) {
+ String html = snippet.getHtml();
+ try {
+ if (snippet.isContainsVariable()) {
+ html = context.replaceVariables(html);
+ }
+ appendHtml(html);
+ } catch (final TagProcessingException e) {
+ throw e;
+ } catch (final RuntimeException e) {
+ final String replace = "<";
+ final String withReplacement = "<";
+ html = html.replaceAll(replace, withReplacement);
+
+ throw new TagProcessingException("Error while processing html block at " + snippet.errorAt() + " - " + e.getMessage(), html, e);
+ }
+ }
+
+ @Override
+ public void appendAsHtmlEncoded(final String string) {
+ appendHtml(encodeHtml(string));
+ // appendHtml(string);
+ }
+
+ @Override
+ public void appendHtml(final String html) {
+ final StringBuffer buffer = buffers.peek();
+ buffer.append(html);
+ }
+
+ public void appendDebug(final String line) {
+ context.appendDebugTrace(encodeHtml(line));
+ }
+
+ private String encodeHtml(final String text) {
+ return encoder.encoder(text);
+ }
+
+ public void appendTruncated(String text, final int truncateTo) {
+ if (truncateTo > 0 && text.length() > truncateTo) {
+ text = text.substring(0, truncateTo) + "...";
+ }
+ appendAsHtmlEncoded(text);
+ }
+
+ private void process(final SwfTag tag, final ElementProcessor processor) {
+ try {
+ LOG.debug("processing " + processor.getName() + " " + tag);
+ appendDebug("\n" + tag.debug());
+ if (tag.getType() == SwfTag.END) {
+ throw new TagProcessingException(tag.errorAt() + " - end tag mistaken for a start tag", tag.toString());
+ }
+ processor.process(this);
+ } catch (final TagProcessingException e) {
+ throw e;
+ } catch (final RuntimeException e) {
+ throw new TagProcessingException("Error while processing " + tag.getName().toLowerCase() + " element at " + tag.errorAt() + " - " + e.getMessage(), tag.toString(), e);
+ }
+ }
+
+ public void processUtilCloseTag() {
+ final SwfTag tag = getTag();
+ if (tag.getType() == SwfTag.EMPTY) {
+ return;
+ }
+ while (index < snippets.size() - 1) {
+ index++;
+ final Snippet snippet = snippets.get(index);
+ if (snippet instanceof HtmlSnippet) {
+ appendSnippet((HtmlSnippet) snippet);
+ } else {
+ final SwfTag nextTag = (SwfTag) snippet;
+ if (tag.getName().equals(nextTag.getName())) {
+ if (nextTag.getType() == SwfTag.START) {
+ } else {
+ return;
+ }
+ }
+ final String name = nextTag.getName();
+ if (nextTag.getType() == SwfTag.END && !tag.getName().equals(name)) {
+ throw new TagProcessingException("Expected " + nextTag.getName().toLowerCase() + " tag but found " + tag.getName().toLowerCase() + " tag at " + nextTag.errorAt(), tag.toString());
+ }
+ final ElementProcessor processor = processors.getFor(name);
+ process(nextTag, processor);
+ }
+ }
+ }
+
+ public void skipUntilClose() {
+ final SwfTag tag = getTag();
+ if (tag.getType() == SwfTag.EMPTY) {
+ if (context.isDebug()) {
+ appendHtml("<!-- " + "skipped " + tag + " -->");
+ }
+ return;
+ }
+ int depth = 1;
+ while (index < snippets.size() - 1) {
+ index++;
+ final Snippet snippet = snippets.get(index);
+ if (snippet instanceof SwfTag) {
+ final SwfTag nextTag = (SwfTag) snippet;
+ if (tag.getName().equals(nextTag.getName())) {
+ if (nextTag.getType() == SwfTag.START) {
+ depth++;
+ } else {
+ depth--;
+ if (depth == 0) {
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public void closeEmpty() {
+ final SwfTag tag = getTag();
+ if (tag.getType() == SwfTag.EMPTY) {
+ return;
+ }
+ if (index < snippets.size()) {
+ final Snippet snippet = snippets.get(index);
+ if (snippet instanceof SwfTag) {
+ final SwfTag nextTag = (SwfTag) snippet;
+ if (nextTag.getType() == SwfTag.EMPTY) {
+ return;
+ }
+ }
+ }
+ throw new ScimpiException("Empty tag not closed");
+ }
+
+ public void pushNewBuffer() {
+ final StringBuffer buffer = new StringBuffer();
+ buffers.push(buffer);
+ }
+
+ public String popBuffer() {
+ final String content = buffers.pop().toString();
+ return content;
+ }
+
+ public SwfTag getTag() {
+ return (SwfTag) snippets.get(index);
+ }
+
+ public RequestContext getContext() {
+ return context;
+ }
+
+ // TODO rename to pushBlock()
+ public void setBlockContent(final BlockContent content) {
+ blocks.add(content);
+ }
+
+ public BlockContent popBlockContent() {
+ return blocks.pop();
+ }
+
+ public BlockContent getBlockContent() {
+ return blocks.peek();
+ }
+
+ public String getViewPath() {
+ return path;
+ }
+
+ public String nextFormId() {
+ return String.valueOf(nextFormId++);
+ }
+
+ public String getOptionalProperty(final String name, final String defaultValue) {
+ return getOptionalProperty(name, defaultValue, true);
+ }
+
+ public String getOptionalProperty(final String name, final String defaultValue, final boolean ensureVariablesExists) {
+ final Attributes attributes = getTag().getAttributes();
+ return attributes.getOptionalProperty(name, defaultValue, ensureVariablesExists);
+ }
+
+ public String getOptionalProperty(final String name) {
+ return getOptionalProperty(name, true);
+ }
+
+ public String getOptionalProperty(final String name, final boolean ensureVariablesExists) {
+ final Attributes attributes = getTag().getAttributes();
+ return attributes.getOptionalProperty(name, ensureVariablesExists);
+ }
+
+ public Attributes getAttributes() {
+ return getTag().getAttributes();
+ }
+
+ public String getRequiredProperty(final String name) {
+ return getRequiredProperty(name, true);
+ }
+
+ public String getRequiredProperty(final String name, final boolean ensureVariablesExists) {
+ final Attributes attributes = getTag().getAttributes();
+ return attributes.getRequiredProperty(name, ensureVariablesExists);
+ }
+
+ public boolean isRequested(final String name) {
+ final Attributes attributes = getTag().getAttributes();
+ return attributes.isRequested(name);
+ }
+
+ public boolean isRequested(final String name, final boolean defaultValue) {
+ final Attributes attributes = getTag().getAttributes();
+ return attributes.isRequested(name, defaultValue);
+ }
+
+ public boolean isPropertySet(final String name) {
+ final Attributes attributes = getTag().getAttributes();
+ return attributes.isPropertySet(name);
+ }
+
+ public boolean isPropertySpecified(final String name) {
+ final Attributes attributes = getTag().getAttributes();
+ return attributes.isPropertySpecified(name);
+ }
+
+ public RepeatMarker createMarker() {
+ return new RepeatMarker(index);
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/SimpleEncoder.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/SimpleEncoder.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/SimpleEncoder.java
new file mode 100644
index 0000000..8b7a2d5
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/SimpleEncoder.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.processor;
+
+import org.apache.commons.lang.StringEscapeUtils;
+
+public class SimpleEncoder implements Encoder {
+
+ @Override
+ public String encoder(final String text) {
+ return StringEscapeUtils.escapeHtml(text);
+ // text.replace("&", "&").replaceAll("<", "<").replaceAll(">",
+ // ">").replace("\"", """);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/TagProcessingException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/TagProcessingException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/TagProcessingException.java
new file mode 100644
index 0000000..d9a8a60
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/TagProcessingException.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.processor;
+
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+
+public class TagProcessingException extends ScimpiException {
+ private static final long serialVersionUID = 1L;
+ private String context;
+
+ public TagProcessingException() {
+ super();
+ }
+
+ public TagProcessingException(final String message, final String context, final Throwable cause) {
+ super(message, cause);
+ this.context = context;
+ }
+
+ public TagProcessingException(final String message, final String context) {
+ super(message);
+ this.context = context;
+ }
+
+ public TagProcessingException(final Throwable cause) {
+ super(cause);
+ }
+
+ public String getContext() {
+ return context;
+ }
+
+ @Override
+ public String getMessage() {
+ return super.getMessage() + "\n" + getContext();
+ }
+
+ @Override
+ public String getHtmlMessage() {
+ return super.getMessage() + "<pre>" + getContext() + "</pre>";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
new file mode 100644
index 0000000..a6ae574
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.util;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.services.ServiceUtil;
+import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.session.IsisSession;
+import org.apache.isis.viewer.scimpi.dispatcher.DispatchException;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+
+public class MethodsUtils {
+ public static final String SERVICE_PREFIX = "service:";
+
+ public static Consent canRunMethod(final ObjectAdapter target, final ObjectAction action, final ObjectAdapter[] parameters) {
+ final Consent consent = action.isProposedArgumentSetValid(target, parameters == null ? new ObjectAdapter[0] : parameters);
+ return consent;
+ }
+
+ public static boolean runMethod(final RequestContext context, final ObjectAction action, final ObjectAdapter target, final ObjectAdapter[] parameters, String variable, Scope scope) {
+ scope = scope == null ? Scope.REQUEST : scope;
+ variable = variable == null ? RequestContext.RESULT : variable;
+
+ final ObjectAdapter result = action.execute(target, parameters == null ? new ObjectAdapter[0] : parameters);
+ if (result == null) {
+ return false;
+ } else {
+ final String mappedId = context.mapObject(result, scope);
+ context.addVariable(variable, mappedId, scope);
+ // context.addVariable(variable + "_type",
+ // action.getFacet(TypeOfFacet.class), scope);
+ return true;
+ }
+ }
+
+ public static boolean runMethod(final RequestContext context, final ObjectAction action, final ObjectAdapter target, final ObjectAdapter[] parameters) {
+ return runMethod(context, action, target, parameters, null, null);
+ }
+
+ public static ObjectAction findAction(final ObjectAdapter object, final String methodName) {
+ if (object == null) {
+ throw new ScimpiException("Object not specified when looking for " + methodName);
+ }
+
+ final List<ObjectAction> actions = object.getSpecification().getObjectActions(Contributed.INCLUDED);
+ final ObjectAction action = findAction(actions, methodName);
+ /*
+ * if (action == null) { actions =
+ * object.getSpecification().getServiceActionsFor(ObjectActionType.USER,
+ * ObjectActionType.EXPLORATION, ObjectActionType.DEBUG); action =
+ * findAction(actions, methodName); }
+ */
+ if (action == null) {
+ throw new DispatchException("Failed to find action " + methodName + " on " + object);
+ }
+ return action;
+ }
+
+ private static ObjectAction findAction(final List<ObjectAction> actions, final String methodName) {
+ for (int i = 0; i < actions.size(); i++) {
+ final ObjectAction objectAction = actions.get(i);
+ if (objectAction.getId().equals(methodName)) {
+ return objectAction;
+ }
+ }
+ return null;
+ }
+
+ public static ObjectAdapter findObject(final RequestContext context, String objectId) {
+ if (objectId == null) {
+ objectId = context.getStringVariable(RequestContext.RESULT);
+ }
+
+ if (objectId != null && objectId.startsWith(SERVICE_PREFIX)) {
+ final String serviceId = objectId.substring(SERVICE_PREFIX.length());
+ final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
+ for (final ObjectAdapter serviceAdapter : serviceAdapters) {
+ final Object service = serviceAdapter.getObject();
+ if (ServiceUtil.id(service).equals(serviceId.trim())) {
+ final ObjectAdapter adapter = getAdapterManager().getAdapterFor(service);
+ return adapter;
+ }
+ }
+ throw new DispatchException("Failed to find service " + serviceId);
+ } else {
+ return context.getMappedObject(objectId);
+ }
+ }
+
+ public static boolean isVisible(final ObjectAdapter object, final ObjectAction action, Where where) {
+ return action.isVisible(getAuthenticationSession(), object, where).isAllowed();
+ }
+
+ public static String isUsable(final ObjectAdapter object, final ObjectAction action, Where where) {
+ final Consent usable = action.isUsable(getAuthenticationSession(), object, where);
+ final boolean isUsable = getSession() != null && usable.isAllowed();
+ return isUsable ? null : usable.getReason();
+ }
+
+ public static boolean isVisibleAndUsable(final ObjectAdapter object, final ObjectAction action, Where where) {
+ AuthenticationSession authenticatedSession = getAuthenticationSession();
+ final boolean isVisible = action.isVisible(authenticatedSession, object, where).isAllowed();
+ final boolean isUsable = getSession() != null && action.isUsable(authenticatedSession, object, where).isAllowed();
+ final boolean isVisibleAndUsable = isVisible && isUsable;
+ return isVisibleAndUsable;
+ }
+
+ private static AuthenticationSession getAuthenticationSession() {
+ return IsisContext.getAuthenticationSession();
+ }
+
+ private static IsisSession getSession() {
+ return IsisContext.getSession();
+ }
+
+ private static AdapterManager getAdapterManager() {
+ return getPersistenceSession().getAdapterManager();
+ }
+
+ private static PersistenceSession getPersistenceSession() {
+ return IsisContext.getPersistenceSession();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HelpLink.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HelpLink.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HelpLink.java
new file mode 100644
index 0000000..477828d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HelpLink.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.view;
+
+import org.apache.isis.core.commons.config.ConfigurationConstants;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class HelpLink extends AbstractElementProcessor {
+
+ private static String site;
+ private static String suffix;
+
+ public static void append(final Request request, final String description, final String helpReference) {
+ request.appendHtml(createHelpSegment(description, helpReference));
+ }
+
+ public static String createHelpSegment(final String description, final String helpReference) {
+ if (site == null) {
+ site = IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.help-site", "/help/");
+ }
+ if (suffix == null) {
+ suffix = IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.help-suffix", "shtml");
+ if (suffix == null || suffix.equals("")) {
+ suffix = "";
+ } else {
+ suffix = "." + suffix;
+ }
+ }
+
+ if (helpReference == null || helpReference.equals("No help available")) {
+ return "";
+ } else {
+ final String elementClass = "help-link";
+ final String link = site + helpReference + suffix;
+ final String linkText = "Help";
+ final String target = "scimpi-help";
+ final String titleSection = description == null ? "" : ("\" title=\"" + description);
+ return "<a class=\"" + elementClass + "\" href=\"" + link + "\" target=\"" + target + titleSection + "\"><img src=\"/images/help.png\" alt=\"" + linkText + "\" /></a>";
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "help";
+ }
+
+ @Override
+ public void process(final Request request) {
+ final String description = null;
+ final String helpReference = request.getRequiredProperty("ref");
+ append(request, description, helpReference);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/History.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/History.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/History.java
new file mode 100644
index 0000000..2f2a9b7
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/History.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.view;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+public class History extends AbstractElementProcessor {
+
+ private static final String _HISTORY = "_history";
+
+ static class Crumb {
+ String name;
+ String link;
+ }
+
+ static class Crumbs implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static final int MAXIMUM_SIZE = 10;
+ private final List<Crumb> crumbs = new ArrayList<Crumb>();
+
+ public void add(final String name, final String link) {
+ for (final Crumb crumb : crumbs) {
+ if (crumb.link.equals(link)) {
+ crumbs.remove(crumb);
+ crumbs.add(crumb);
+ return;
+ }
+ }
+
+ final Crumb crumb = new Crumb();
+ crumb.name = name;
+ crumb.link = link;
+ crumbs.add(crumb);
+
+ if (crumbs.size() > MAXIMUM_SIZE) {
+ crumbs.remove(0);
+ }
+ }
+
+ public void clear() {
+ crumbs.clear();
+ }
+
+ public boolean isEmpty() {
+ return crumbs.size() == 0;
+ }
+
+ public int size() {
+ return crumbs.size();
+ }
+
+ public Iterable<Crumb> iterator() {
+ return crumbs;
+ }
+
+ }
+
+ @Override
+ public String getName() {
+ return "history";
+ }
+
+ @Override
+ public void process(final Request request) {
+ final String action = request.getOptionalProperty("action", "display");
+ final Crumbs crumbs = getCrumbs(request);
+ if (action.equals("display") && crumbs != null) {
+ write(crumbs, request);
+ } else if (action.equals("link")) {
+ final String name = request.getRequiredProperty(NAME);
+ final String link = request.getRequiredProperty(LINK_VIEW);
+ crumbs.add(name, link);
+ } else if (action.equals("object")) {
+ final String id = request.getOptionalProperty(OBJECT);
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), id);
+ final String name = object.titleString();
+ String link = request.getRequiredProperty(LINK_VIEW);
+ link += "?_result=" + id;
+ crumbs.add(name, link);
+ } else if (action.equals("return")) {
+
+ } else if (action.equals("clear")) {
+ crumbs.clear();
+ }
+
+ }
+
+ public void write(final Crumbs crumbs, final Request request) {
+ if (crumbs.isEmpty()) {
+ return;
+ }
+
+ request.appendHtml("<div id=\"history\">");
+ int i = 0;
+ final int length = crumbs.size();
+ for (final Crumb crumb : crumbs.iterator()) {
+ final String link = crumb.link;
+ if (i > 0) {
+ request.appendHtml("<span class=\"separator\"> | </span>");
+ }
+ if (i == length - 1 || link == null) {
+ request.appendHtml("<span class=\"disabled\">");
+ request.appendHtml(crumb.name);
+ request.appendHtml("</span>");
+ } else {
+ request.appendHtml("<a class=\"linked\" href=\"" + link + "\">");
+ request.appendHtml(crumb.name);
+ request.appendHtml("</a>");
+ }
+ i++;
+ }
+ request.appendHtml("</div>");
+ }
+
+ private Crumbs getCrumbs(final Request request) {
+ final RequestContext context = request.getContext();
+ Crumbs crumbs = (Crumbs) context.getVariable(_HISTORY);
+ if (crumbs == null) {
+ crumbs = new Crumbs();
+ context.addVariable(_HISTORY, crumbs, Scope.SESSION);
+ }
+ return crumbs;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HtmlSnippet.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HtmlSnippet.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HtmlSnippet.java
new file mode 100644
index 0000000..f1807df
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HtmlSnippet.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view;
+
+public class HtmlSnippet implements Snippet {
+ private final StringBuffer html = new StringBuffer();
+ private boolean containsVariable;
+ private final String lineNumbers;
+ private final String path;
+
+ public HtmlSnippet(final String lineNumbers, final String path) {
+ this.lineNumbers = lineNumbers;
+ this.path = path;
+ }
+
+ public void append(final String html) {
+ this.html.append(html);
+ containsVariable |= html.indexOf("${") >= 0;
+ }
+
+ @Override
+ public String getHtml() {
+ return html.toString();
+ }
+
+ public boolean isContainsVariable() {
+ return containsVariable;
+ }
+
+ @Override
+ public String errorAt() {
+ return path + ":" + lineNumbers;
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/Snippet.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/Snippet.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/Snippet.java
new file mode 100644
index 0000000..b8a7b3e
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/Snippet.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view;
+
+public interface Snippet {
+
+ String getHtml();
+
+ String errorAt();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/SwfTag.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/SwfTag.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/SwfTag.java
new file mode 100644
index 0000000..6b097bb
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/SwfTag.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view;
+
+import org.apache.isis.viewer.scimpi.dispatcher.action.Attributes;
+
+public class SwfTag implements Snippet {
+
+ public static final int END = 0;
+ public static final int EMPTY = 1;
+ public static final int START = 2;
+ private final String tagName;
+ private final int type;
+ private final Attributes attributes;
+ private final String lineNumbers;
+ private final String path;
+
+ public SwfTag(final String tagName, final Attributes attributes, final int type, final String lineNumbers, final String path) {
+ this.tagName = tagName;
+ this.attributes = attributes;
+ this.type = type;
+ this.lineNumbers = lineNumbers;
+ this.path = path;
+ }
+
+ @Override
+ public String getHtml() {
+ return tagName;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public String getName() {
+ return tagName;
+ }
+
+ public Attributes getAttributes() {
+ return attributes;
+ }
+
+ @Override
+ public String errorAt() {
+ return path + ":" + lineNumbers;
+ }
+
+ public String debug() {
+ return path + ":" + lineNumbers + " - " + getAttributes();
+ }
+
+ @Override
+ public String toString() {
+ String t = null;
+ switch (type) {
+ case EMPTY:
+ t = "empty";
+ break;
+ case START:
+ t = "start";
+ break;
+ case END:
+ t = "end";
+ break;
+ }
+ return "SwfTag[name=" + tagName + ",path=" + path + ",line=" + lineNumbers + ",type=" + t + "]";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/VersionNumber.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/VersionNumber.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/VersionNumber.java
new file mode 100644
index 0000000..6b054b1
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/VersionNumber.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.view;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class VersionNumber extends AbstractElementProcessor {
+
+ private static final String MARKER = "Implementation-Build: ";
+ private static final String FILE = "/META-INF/MANIFEST.MF";
+ private String version;
+
+ @Override
+ public String getName() {
+ return "version-number";
+ }
+
+ @Override
+ public void process(final Request request) {
+ if (version == null) {
+ version = "0000"; // default revision number
+ loadRevisonNumber(request.getContext());
+ }
+ request.appendHtml(version);
+ }
+
+ private void loadRevisonNumber(final RequestContext context) {
+ BufferedReader reader;
+ try {
+ String file = FILE;
+
+ file = context.findFile(FILE);
+ reader = new BufferedReader(new InputStreamReader(context.openStream(file)));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ if (line.startsWith(MARKER)) {
+ version = line.substring(MARKER.length());
+ break;
+ }
+ }
+ reader.close();
+ } catch (final IOException e) {
+ throw new ScimpiException(e);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionButton.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionButton.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionButton.java
new file mode 100644
index 0000000..740de00
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionButton.java
@@ -0,0 +1,237 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.action;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
+
+public class ActionButton extends AbstractElementProcessor {
+ private static final Logger LOG = LoggerFactory.getLogger(ActionButton.class);
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final static Where where = Where.ANYWHERE;
+
+ @Override
+ public void process(final Request request) {
+ final String objectId = request.getOptionalProperty(OBJECT);
+ final String methodName = request.getRequiredProperty(METHOD);
+ final String forwardResultTo = request.getOptionalProperty(VIEW);
+ final String forwardVoidTo = request.getOptionalProperty(VOID);
+ final String forwardErrorTo = request.getOptionalProperty(ERROR);
+ final String variable = request.getOptionalProperty(RESULT_NAME);
+ final String scope = request.getOptionalProperty(SCOPE);
+ final String buttonTitle = request.getOptionalProperty(BUTTON_TITLE);
+ String resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
+ final String idName = request.getOptionalProperty(ID, methodName);
+ final String className = request.getOptionalProperty(CLASS);
+ final boolean showMessage = request.isRequested(SHOW_MESSAGE, false);
+ final String completionMessage = request.getOptionalProperty(MESSAGE);
+
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
+ final String version = request.getContext().mapVersion(object);
+ final ObjectAction action = MethodsUtils.findAction(object, methodName);
+
+ final ActionContent parameterBlock = new ActionContent(action);
+ request.setBlockContent(parameterBlock);
+ request.processUtilCloseTag();
+ final String[] parameters = parameterBlock.getParameters();
+ final ObjectAdapter[] objectParameters;
+
+ final ObjectAdapter target;
+ if (false /*action.isContributed()*/) {
+// objectParameters= null;
+// System.arraycopy(parameters, 0, parameters, 1, parameters.length - 1);
+// parameters[0] = request.getContext().mapObject(object, Scope.REQUEST);
+// target = action.realTarget(object);
+// if (!action.hasReturn() && resultOverride == null) {
+// resultOverride = parameters[0];
+// }
+ } else {
+ objectParameters = new ObjectAdapter[parameters.length];
+ target = object;
+ int i = 0;
+ for (final ObjectActionParameter spec : action.getParameters()) {
+ final ObjectSpecification type = spec.getSpecification();
+ if (parameters[i] == null) {
+ objectParameters[i] = null;
+ } else if (type.getFacet(ParseableFacet.class) != null) {
+ final ParseableFacet facet = type.getFacet(ParseableFacet.class);
+ Localization localization = IsisContext.getLocalization();
+ objectParameters[i] = facet.parseTextEntry(null, parameters[i], localization);
+ } else {
+ objectParameters[i] = MethodsUtils.findObject(request.getContext(), parameters[i]);
+ }
+ i++;
+ }
+ }
+
+ if (MethodsUtils.isVisibleAndUsable(object, action, where) && MethodsUtils.canRunMethod(object, action, objectParameters).isAllowed()) {
+ // TODO use the form creation mechanism as used in ActionForm
+ write(request, target, action, parameters, version, forwardResultTo, forwardVoidTo, forwardErrorTo, variable, scope, buttonTitle, completionMessage, resultOverride, idName, className);
+ }
+
+ if (showMessage) {
+ final Consent usable = action.isUsable(IsisContext.getAuthenticationSession(), object, where);
+ if (usable.isVetoed()) {
+ final String notUsable = usable.getReason();
+ if (notUsable != null) {
+ String title = buttonTitle == null ? action.getName() : buttonTitle;
+ disabledButton(request, title, notUsable, idName, className);
+ }
+ } else {
+ final Consent valid = action.isProposedArgumentSetValid(object, objectParameters);
+ final String notValid = valid.getReason();
+ if (notValid != null) {
+ String title = buttonTitle == null ? action.getName() : buttonTitle;
+ disabledButton(request, title, notValid, idName, className);
+ }
+ }
+ }
+
+ request.popBlockContent();
+ }
+
+ private void disabledButton(final Request request, final String buttonTitle, String message, String id, String className) {
+ if (className == null) {
+ className = "access";
+ }
+ request.appendHtml("<div id=\"" + id + "\" class=\"" + className + " disabled-form\">");
+ request.appendHtml("<div class=\"button disabled\" title=\"");
+ request.appendAsHtmlEncoded(message);
+ request.appendHtml("\" >" + buttonTitle);
+ request.appendHtml("</div>");
+ request.appendHtml("</div>");
+ }
+
+ public static void write(
+ final Request request,
+ final ObjectAdapter object,
+ final ObjectAction action,
+ final String[] parameters,
+ final String version,
+ String forwardResultTo,
+ String forwardVoidTo,
+ String forwardErrorTo,
+ final String variable,
+ final String scope,
+ String buttonTitle,
+ final String completionMessage,
+ final String resultOverride,
+ final String idName,
+ final String className) {
+ final RequestContext context = request.getContext();
+
+ buttonTitle = buttonTitle != null ? buttonTitle : action.getName();
+
+ if (action.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
+ LOG.info("action not visible " + action.getName());
+ return;
+ }
+ final Consent usable = action.isUsable(IsisContext.getAuthenticationSession(), object, where);
+ if (usable.isVetoed()) {
+ LOG.info("action not available: " + usable.getReason());
+ return;
+ }
+
+ /*
+ *
+ * TODO this mechanism fails as it tries to process tags - which we dont
+ * need! Also it calls action 'edit' (not 'action'). Field[] fields =
+ * new Field[0]; HiddenField[] hiddenFields = new HiddenField[] { new
+ * HiddenField("service", serviceId), new HiddenField("method",
+ * methodName), new HiddenField("view", forwardToView), variable == null
+ * ? null : new HiddenField("variable", variable), };
+ * Form.createForm(request, buttonTitle, fields, hiddenFields, false);
+ */
+
+ final String objectId = context.mapObject(object, Scope.INTERACTION);
+ final String idSegment = idName == null ? "" : ("id=\"" + idName + "\" ");
+ final String classSegment = "class=\"" + (className == null ? "action in-line" : className) + "\"";
+ request.appendHtml("\n<form " + idSegment + classSegment + " action=\"action.app\" method=\"post\">\n");
+ if (objectId == null) {
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + OBJECT + "\" value=\"" + context.getVariable(RequestContext.RESULT) + "\" />\n");
+ } else {
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + OBJECT + "\" value=\"" + StringEscapeUtils.escapeHtml(objectId) + "\" />\n");
+ }
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + VERSION + "\" value=\"" + version + "\" />\n");
+ if (scope != null) {
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + SCOPE + "\" value=\"" + scope + "\" />\n");
+ }
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + METHOD + "\" value=\"" + action.getId() + "\" />\n");
+ if (forwardResultTo != null) {
+ forwardResultTo = context.fullFilePath(forwardResultTo);
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + VIEW + "\" value=\"" + forwardResultTo + "\" />\n");
+ }
+ if (forwardErrorTo == null) {
+ forwardErrorTo = request.getContext().getResourceFile();
+ }
+ forwardErrorTo = context.fullFilePath(forwardErrorTo);
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + ERROR + "\" value=\"" + forwardErrorTo + "\" />\n");
+ if (forwardVoidTo == null) {
+ forwardVoidTo = request.getContext().getResourceFile();
+ }
+ forwardVoidTo = context.fullFilePath(forwardVoidTo);
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + VOID + "\" value=\"" + forwardVoidTo + "\" />\n");
+ if (variable != null) {
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + RESULT_NAME + "\" value=\"" + variable + "\" />\n");
+ }
+ if (resultOverride != null) {
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + RESULT_OVERRIDE + "\" value=\"" + resultOverride + "\" />\n");
+ }
+ if (completionMessage != null) {
+ request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + MESSAGE + "\" value=\"" + completionMessage + "\" />\n");
+ }
+
+ for (int i = 0; i < parameters.length; i++) {
+ request.appendHtml(" <input type=\"hidden\" name=\"param" + (i + 1) + "\" value=\"" + parameters[i] + "\" />\n");
+ }
+ request.appendHtml(request.getContext().interactionFields());
+ request.appendHtml(" <input class=\"button\" type=\"submit\" value=\"" + buttonTitle + "\" name=\"execute\" title=\"" + action.getDescription() + "\" />");
+ HelpLink.append(request, action.getDescription(), action.getHelp());
+ request.appendHtml("\n</form>\n");
+ }
+
+ @Override
+ public String getName() {
+ return "action-button";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionContent.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionContent.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionContent.java
new file mode 100644
index 0000000..2466726
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionContent.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.action;
+
+import java.util.List;
+
+import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class ActionContent implements BlockContent {
+ private final ObjectAction action;
+ private final String[] parameters;
+ private int next;
+
+ public ActionContent(final ObjectAction action) {
+ this.action = action;
+ this.parameters = new String[action.getParameterCount()];
+ }
+
+ public void setParameter(final String field, final String value) {
+ int index;
+ if (field == null) {
+ index = next++;
+ } else {
+ index = Integer.valueOf(field).intValue() - 1;
+ }
+ if (index < 0 || index >= parameters.length) {
+ throw new ScimpiException("Parameter numbers should be between 1 and " + parameters.length + ": " + index);
+ }
+ parameters[index] = value;
+ }
+
+ public ObjectAdapter[] getParameters(final Request request) {
+ final ObjectAdapter[] params = new ObjectAdapter[parameters.length];
+ final List<ObjectActionParameter> pars = action.getParameters();
+ for (int i = 0; i < parameters.length; i++) {
+ final ObjectSpecification typ = pars.get(i).getSpecification();
+ if (typ.getFacet(ParseableFacet.class) != null) {
+ final ParseableFacet facet = typ.getFacet(ParseableFacet.class);
+ Localization localization = IsisContext.getLocalization();
+ params[i] = facet.parseTextEntry(null, parameters[i], localization);
+ } else {
+ params[i] = request.getContext().getMappedObject(parameters[i]);
+ }
+ }
+ return params;
+ }
+
+ public String[] getParameters() {
+ return parameters;
+ }
+}
[15/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Warnings.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Warnings.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Warnings.java
deleted file mode 100644
index 52be7d6..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Warnings.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.util.List;
-import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Warnings extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String cls = request.getOptionalProperty(CLASS);
- final StringBuffer buffer = new StringBuffer();
- write(cls, buffer);
- if (buffer.length() > 0) {
- request.appendHtml("<div class=\"feedback\">");
- request.appendHtml(buffer.toString());
- request.appendHtml("</div>");
- }
- }
-
- public static void write(String cls, final StringBuffer buffer) {
- if (cls == null) {
- cls = "warning";
- }
- final MessageBroker messageBroker = IsisContext.getMessageBroker();
- final List<String> warnings = messageBroker.getWarnings();
- for (final String warning : warnings) {
- buffer.append("<div class=\"" + cls + "\">" + warning + "</div>");
- }
- }
-
- @Override
- public String getName() {
- return "warnings";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
deleted file mode 100644
index deafb1a..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.facets.object.choices.enums.EnumFacet;
-import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueFacet;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.EditAction;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.HiddenInputField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.HtmlFormBuilder;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
-
-public class EditObject extends AbstractElementProcessor {
-
- // REVIEW: confirm this rendering context
- private final Where where = Where.OBJECT_FORMS;
-
- @Override
- public void process(final Request request) {
- final RequestContext context = request.getContext();
-
- final String objectId = request.getOptionalProperty(OBJECT);
- final String forwardEditedTo = request.getOptionalProperty(VIEW);
- final String forwardErrorTo = request.getOptionalProperty(ERROR);
- final String cancelTo = request.getOptionalProperty(CANCEL_TO);
- final boolean hideNonEditableFields = request.isRequested(HIDE_UNEDITABLE, false);
- final boolean showIcon = request.isRequested(SHOW_ICON, showIconByDefault());
- final String labelDelimiter = request.getOptionalProperty(LABEL_DELIMITER, ":");
- String buttonTitle = request.getOptionalProperty(BUTTON_TITLE);
- String formTitle = request.getOptionalProperty(FORM_TITLE);
- final String formId = request.getOptionalProperty(FORM_ID, request.nextFormId());
- final String variable = request.getOptionalProperty(RESULT_NAME);
- final String resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
- final String scope = request.getOptionalProperty(SCOPE);
- final String className = request.getOptionalProperty(CLASS, "edit full");
- final String completionMessage = request.getOptionalProperty(MESSAGE);
-
- final ObjectAdapter object = context.getMappedObjectOrResult(objectId);
- final String actualObjectId = context.mapObject(object, Scope.INTERACTION);
- final String version = context.mapVersion(object);
-
- final String id = request.getOptionalProperty(ID, object.getSpecification().getShortIdentifier());
-
- final FormState entryState = (FormState) context.getVariable(ENTRY_FIELDS);
-
- final ObjectSpecification specification = object.getSpecification();
- final FormFieldBlock containedBlock = new FormFieldBlock() {
- @Override
- public boolean isVisible(final String name) {
- final ObjectAssociation fld = specification.getAssociation(name);
- final boolean isVisible = fld.isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed();
- final boolean isUseable = fld.isUsable(IsisContext.getAuthenticationSession(), object, where).isAllowed();
- return isVisible && isUseable;
- }
-
- @Override
- public ObjectAdapter getCurrent(final String name) {
- ObjectAdapter value = null;
- if (entryState != null) {
- final FieldEditState field2 = entryState.getField(name);
- value = field2.getValue();
- }
- if (value == null) {
- final ObjectAssociation fld = specification.getAssociation(name);
- value = fld.get(object);
- }
- return value;
- }
-
- @Override
- public boolean isNullable(final String name) {
- final ObjectAssociation fld = specification.getAssociation(name);
- return !fld.isMandatory();
- }
- };
-
- request.setBlockContent(containedBlock);
- request.processUtilCloseTag();
-
- final AuthenticationSession session = IsisContext.getAuthenticationSession();
- List<ObjectAssociation> viewFields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, object, where));
- viewFields = containedBlock.includedFields(viewFields);
- final InputField[] formFields = createFields(viewFields);
-
- initializeFields(context, object, formFields, entryState, !hideNonEditableFields);
- setDefaults(context, object, formFields, entryState, showIcon);
-
- copyFieldContent(context, object, formFields, showIcon);
- overrideWithHtml(context, containedBlock, formFields);
- String errors = null;
- if (entryState != null && entryState.isForForm(formId)) {
- copyEntryState(context, object, formFields, entryState);
- errors = entryState.getError();
- }
-
- final String errorView = context.fullFilePath(forwardErrorTo == null ? context.getResourceFile() : forwardErrorTo);
- final List<HiddenInputField> hiddenFields = new ArrayList<HiddenInputField>();
- hiddenFields.add(new HiddenInputField("_" + OBJECT, actualObjectId));
- hiddenFields.add(new HiddenInputField("_" + VERSION, version));
- hiddenFields.add(new HiddenInputField("_" + FORM_ID, formId));
- hiddenFields.add(completionMessage == null ? null : new HiddenInputField("_" + MESSAGE, completionMessage));
- hiddenFields.add(forwardEditedTo == null ? null : new HiddenInputField("_" + VIEW, context.fullFilePath(forwardEditedTo)));
- hiddenFields.add(new HiddenInputField("_" + ERROR, errorView));
- hiddenFields.add(variable == null ? null : new HiddenInputField("_" + RESULT_NAME, variable));
- hiddenFields.add(resultOverride == null ? null : new HiddenInputField("_" + RESULT_OVERRIDE, resultOverride));
- hiddenFields.add(scope == null ? null : new HiddenInputField("_" + SCOPE, scope));
-
- if (!object.isTransient()) {
- // ensure all booleans are included so the pass back TRUE if set.
- final List<ObjectAssociation> fields2 = object.getSpecification().getAssociations(Contributed.EXCLUDED);
- for (int i = 0; i < fields2.size(); i++) {
- final ObjectAssociation field = fields2.get(i);
- if (!viewFields.contains(field) && field.getSpecification().containsFacet(BooleanValueFacet.class)) {
- final String fieldId = field.getId();
- final String value = getValue(context, field.get(object));
- hiddenFields.add(new HiddenInputField(fieldId, value));
- }
- }
- }
-
- if (formTitle == null) {
- formTitle = specification.getSingularName();
- }
-
- if (buttonTitle == null) {
- buttonTitle = "Save " + specification.getSingularName();
- } else if (buttonTitle.equals("")) {
- buttonTitle = "Save";
- }
-
- final HiddenInputField[] hiddenFieldArray = hiddenFields.toArray(new HiddenInputField[hiddenFields.size()]);
- HtmlFormBuilder.createForm(request, EditAction.ACTION + ".app", hiddenFieldArray, formFields, className, id, formTitle,
- labelDelimiter, null, null, buttonTitle, errors, cancelTo);
- request.popBlockContent();
- }
-
- private InputField[] createFields(final List<ObjectAssociation> fields) {
- final InputField[] formFields = new InputField[fields.size()];
- int length = 0;
- for (int i = 0; i < fields.size(); i++) {
- if (!fields.get(i).isOneToManyAssociation()) {
- formFields[i] = new InputField(fields.get(i).getId());
- length++;
- }
- }
- final InputField[] array = new InputField[length];
- for (int i = 0, j = 0; i < formFields.length; i++) {
- if (formFields[i] != null) {
- array[j++] = formFields[i];
- }
- }
- return array;
- }
-
- // TODO duplicated in ActionForm#initializeFields
- private void initializeFields(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final FormState entryState, final boolean includeUnusableFields) {
- for (final InputField formField : formFields) {
- final String fieldId = formField.getName();
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldId);
- final AuthenticationSession session = IsisContext.getAuthenticationSession();
- final Consent usable = field.isUsable(session, object, where);
- final ObjectAdapter[] options = field.getChoices(object);
- FieldFactory.initializeField(context, object, field, options, field.isMandatory(), formField);
-
- final boolean isEditable = usable.isAllowed();
- if (!isEditable) {
- formField.setDescription(usable.getReason());
- }
- formField.setEditable(isEditable);
- final boolean hiddenField = field.isVisible(session, object, where).isVetoed();
- final boolean unusable = usable.isVetoed();
- final boolean hideAsUnusable = unusable && !includeUnusableFields;
- if (hiddenField || hideAsUnusable) {
- formField.setHidden(true);
- }
- }
- }
-
- private void copyFieldContent(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final boolean showIcon) {
- for (final InputField inputField : formFields) {
- final String fieldName = inputField.getName();
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed()) {
- ResolveFieldUtil.resolveField(object, field);
- final ObjectAdapter fieldValue = field.get(object);
- if (inputField.isEditable()) {
- final String value = getValue(context, fieldValue);
- if (!value.equals("") || inputField.getValue() == null) {
- inputField.setValue(value);
- }
- } else {
- final String entry = getValue(context, fieldValue);
- inputField.setHtml(entry);
- inputField.setType(InputField.HTML);
-
- }
-
- if (field.getSpecification().getFacet(ParseableFacet.class) == null) {
- if (fieldValue != null) {
- final String iconSegment = showIcon ? "<img class=\"small-icon\" src=\"" + context.imagePath(field.getSpecification()) + "\" alt=\"" + field.getSpecification().getShortIdentifier() + "\"/>" : "";
- final String entry = iconSegment + fieldValue.titleString();
- inputField.setHtml(entry);
- } else {
- final String entry = "<em>none specified</em>";
- inputField.setHtml(entry);
- }
- }
- }
- }
- }
-
- private void setDefaults(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final FormState entryState, final boolean showIcon) {
- for (final InputField formField : formFields) {
- final String fieldId = formField.getName();
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldId);
- final ObjectAdapter defaultValue = field.getDefault(object);
- if (defaultValue == null) {
- continue;
- }
-
- final String title = defaultValue.titleString();
- if (field.getSpecification().containsFacet(ParseableFacet.class)) {
- formField.setValue(title);
- } else if (field.isOneToOneAssociation()) {
- final ObjectSpecification objectSpecification = field.getSpecification();
- if (defaultValue != null) {
- final String iconSegment = showIcon ? "<img class=\"small-icon\" src=\"" + context.imagePath(objectSpecification) + "\" alt=\"" + objectSpecification.getShortIdentifier() + "\"/>" : "";
- final String html = iconSegment + title;
- formField.setHtml(html);
- final String value = defaultValue == null ? null : context.mapObject(defaultValue, Scope.INTERACTION);
- formField.setValue(value);
- }
- }
- }
- }
-
- private void overrideWithHtml(final RequestContext context, final FormFieldBlock containedBlock, final InputField[] formFields) {
- for (final InputField formField : formFields) {
- final String fieldId = formField.getName();
- if (containedBlock.hasContent(fieldId)) {
- final String content = containedBlock.getContent(fieldId);
- if (content != null) {
- formField.setHtml(content);
- formField.setValue(null);
- formField.setType(InputField.HTML);
- }
- }
- }
- }
-
- private void copyEntryState(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final FormState entryState) {
- for (final InputField formField : formFields) {
- final String fieldId = formField.getName();
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldId);
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed() && formField.isEditable()) {
- final FieldEditState fieldState = entryState.getField(field.getId());
- final String entry = fieldState == null ? "" : fieldState.getEntry();
- formField.setValue(entry);
- final String error = fieldState == null ? "" : fieldState.getError();
- formField.setErrorText(error);
- }
- }
- }
-
- private String getValue(final RequestContext context, final ObjectAdapter field) {
- if (field == null || field.isTransient()) {
- return "";
- }
- final ObjectSpecification specification = field.getSpecification();
- if (specification.containsFacet(EnumFacet.class)) {
- return String.valueOf(field.getObject());
- } else if (specification.getFacet(ParseableFacet.class) == null) {
- return context.mapObject(field, Scope.INTERACTION);
- } else {
- return field.titleString();
- }
- }
-
- @Override
- public String getName() {
- return "edit";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FieldFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FieldFactory.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FieldFactory.java
deleted file mode 100644
index 35a9158..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FieldFactory.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacet;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
-import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueFacet;
-import org.apache.isis.core.metamodel.facets.value.password.PasswordValueFacet;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
-
-public class FieldFactory {
-
- public static void initializeField(final RequestContext context, final ObjectAdapter object, final ObjectFeature param, final ObjectAdapter[] optionsForParameter, final boolean isRequired, final InputField field) {
-
- field.setLabel(param.getName());
- field.setDescription(param.getDescription());
- field.setDataType(param.getSpecification().getShortIdentifier());
- if (param instanceof ObjectMember) {
- field.setHelpReference(((ObjectMember) param).getHelp());
- } else {
- final HelpFacet helpFacet = param.getFacet(HelpFacet.class);
- final String value = helpFacet.value();
- field.setHelpReference(value);
- }
- field.setRequired(isRequired);
- field.setHidden(false);
-
- if (param.getSpecification().getFacet(ParseableFacet.class) != null) {
- final int maxLength = param.getFacet(MaxLengthFacet.class).value();
- field.setMaxLength(maxLength);
-
- final TypicalLengthFacet typicalLengthFacet = param.getFacet(TypicalLengthFacet.class);
- if (typicalLengthFacet.isDerived() && maxLength > 0) {
- field.setWidth(maxLength);
- } else {
- field.setWidth(typicalLengthFacet.value());
- }
-
- final MultiLineFacet multiLineFacet = param.getFacet(MultiLineFacet.class);
- field.setHeight(multiLineFacet.numberOfLines());
- field.setWrapped(!multiLineFacet.preventWrapping());
-
- final ObjectSpecification spec = param.getSpecification();
- if (spec.containsFacet(BooleanValueFacet.class)) {
- field.setType(InputField.CHECKBOX);
- } else if (spec.containsFacet(PasswordValueFacet.class)) {
- field.setType(InputField.PASSWORD);
- } else {
- field.setType(InputField.TEXT);
- }
-
- } else {
- field.setType(InputField.REFERENCE);
- }
-
- if (optionsForParameter != null) {
- final int noOptions = optionsForParameter.length;
- final String[] optionValues = new String[noOptions];
- final String[] optionTitles = new String[noOptions];
- for (int j = 0; j < optionsForParameter.length; j++) {
- final int i = j; // + (field.isRequired() ? 0 : 1);
- optionValues[i] = getValue(context, optionsForParameter[j]);
- optionTitles[i] = optionsForParameter[j].titleString();
- }
- field.setOptions(optionTitles, optionValues);
- }
- }
-
- private static String getValue(final RequestContext context, final ObjectAdapter field) {
- if (field == null) {
- return "";
- }
- if (field.getSpecification().getFacet(ParseableFacet.class) == null) {
- return context.mapObject(field, Scope.INTERACTION);
- } else {
- return field.getObject().toString();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormEntry.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormEntry.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormEntry.java
deleted file mode 100644
index 5d57740..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormEntry.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class FormEntry extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final FormFieldBlock block = (FormFieldBlock) request.getBlockContent();
- final String field = request.getRequiredProperty(FIELD);
- final String value = request.getRequiredProperty(VALUE);
- final boolean isHidden = request.isRequested(HIDDEN, true);
- block.exclude(field);
- // TODO this is replaced because the field is marked as hidden!
- final String content = "reference <input type=\"" + (isHidden ? "hidden" : "text") + "\" disabled=\"disabled\" name=\"" + field + "\" value=\"" + value + "\" />";
- block.replaceContent(field, content);
- }
-
- @Override
- public String getName() {
- return "form-entry";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormField.java
deleted file mode 100644
index 55c7425..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormField.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class FormField extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final FormFieldBlock block = (FormFieldBlock) request.getBlockContent();
- final String field = request.getRequiredProperty(FIELD);
- if (block.isVisible(field)) {
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String content = request.popBuffer();
- block.replaceContent(field, content);
- }
- }
-
- @Override
- public String getName() {
- return "form-field";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormFieldBlock.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormFieldBlock.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormFieldBlock.java
deleted file mode 100644
index 294a239..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormFieldBlock.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.InclusionList;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
-
-public class FormFieldBlock extends InclusionList {
- private final Map<String, String> content = new HashMap<String, String>();
- private final Map<String, String> values = new HashMap<String, String>();
-
- public void replaceContent(final String field, final String htmlString) {
- content.put(field, htmlString);
- }
-
- public boolean hasContent(final String name) {
- return content.containsKey(name);
- }
-
- public String getContent(final String name) {
- return content.get(name);
- }
-
- public boolean isVisible(final String name) {
- return true;
- }
-
- public boolean isNullable(final String name) {
- return true;
- }
-
- public ObjectAdapter getCurrent(final String name) {
- return null;
- }
-
- public void value(final String field, final String value) {
- values.put(field, value);
- }
-
- public void setUpValues(final InputField[] inputFields) {
- for (final InputField inputField : inputFields) {
- final String name = inputField.getName();
- inputField.setValue(values.get(name));
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/HiddenField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/HiddenField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/HiddenField.java
deleted file mode 100644
index 71019ea..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/HiddenField.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
-import org.apache.isis.viewer.scimpi.dispatcher.TagOrderException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class HiddenField extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final BlockContent blockContent = request.getBlockContent();
- if (!(blockContent instanceof FormFieldBlock)) {
- throw new TagOrderException(request);
- }
-
- final String field = request.getOptionalProperty("name");
- final String value = request.getRequiredProperty("value");
- final FormFieldBlock block = (FormFieldBlock) blockContent;
- block.value(field, value);
- block.exclude(field);
- }
-
- @Override
- public String getName() {
- return "hidden-field";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/RadioListField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/RadioListField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/RadioListField.java
deleted file mode 100644
index 7b3c1e6..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/RadioListField.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
-
-import java.util.Iterator;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class RadioListField extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final FormFieldBlock block = (FormFieldBlock) request.getBlockContent();
- final String field = request.getRequiredProperty(FIELD);
- if (block.isVisible(field)) {
- final String id = request.getRequiredProperty(COLLECTION);
- final String exclude = request.getOptionalProperty("exclude");
-
- final ObjectAdapter collection = request.getContext().getMappedObjectOrResult(id);
-
- final RequestContext context = request.getContext();
- final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
- final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
-
- final StringBuffer buffer = new StringBuffer();
-
- while (iterator.hasNext()) {
- final ObjectAdapter element = iterator.next();
- final Scope scope = Scope.INTERACTION;
- final String elementId = context.mapObject(element, scope);
- if (exclude != null && context.getMappedObject(exclude) == element) {
- continue;
- }
- final String title = element.titleString();
- final String checked = "";
- buffer.append("<input type=\"radio\" name=\"" + field + "\" value=\"" + elementId + "\"" + checked + " />" + title + "</input><br/>\n");
- }
-
- block.replaceContent(field, buffer.toString());
- }
- }
-
- @Override
- public String getName() {
- return "radio-list";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/Selector.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/Selector.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/Selector.java
deleted file mode 100644
index e814f28..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/Selector.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
-
-import java.util.Iterator;
-
-import org.apache.isis.core.commons.exceptions.UnknownTypeException;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-import org.apache.isis.viewer.scimpi.dispatcher.view.action.ActionForm;
-import org.apache.isis.viewer.scimpi.dispatcher.view.action.CreateFormParameter;
-
-public class Selector extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final FormFieldBlock block = (FormFieldBlock) request.getBlockContent();
- final String field = request.getRequiredProperty(FIELD);
- if (block.isVisible(field)) {
- processElement(request, block, field);
- }
- request.skipUntilClose();
- }
-
- private void processElement(final Request request, final FormFieldBlock block, final String field) {
- final String type = request.getOptionalProperty(TYPE, "dropdown");
- if (!request.isPropertySpecified(METHOD) && request.isPropertySpecified(COLLECTION)) {
- final String id = request.getRequiredProperty(COLLECTION, Request.NO_VARIABLE_CHECKING);
- final String selector = showSelectionList(request, id, block.getCurrent(field), block.isNullable(field), type);
- block.replaceContent(field, selector);
- } else {
- final String objectId = request.getOptionalProperty(OBJECT);
- final String methodName = request.getRequiredProperty(METHOD);
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
- final ObjectAction action = MethodsUtils.findAction(object, methodName);
- if (action.getParameterCount() == 0) {
- final ObjectAdapter collection = action.execute(object, new ObjectAdapter[0]);
- final String selector = showSelectionList(request, collection, block.getCurrent(field), block.isNullable(field), type);
- block.replaceContent(field, selector);
- } else {
- final String id = "selector_options";
- final String id2 = (String) request.getContext().getVariable(id);
- final String selector = showSelectionList(request, id2, block.getCurrent(field), block.isNullable(field), type);
-
- final CreateFormParameter parameters = new CreateFormParameter();
- parameters.objectId = objectId;
- parameters.methodName = methodName;
- parameters.buttonTitle = request.getOptionalProperty(BUTTON_TITLE, "Search");
- parameters.formTitle = request.getOptionalProperty(FORM_TITLE);
- parameters.className = request.getOptionalProperty(CLASS, "selector");
- parameters.id = request.getOptionalProperty(ID);
-
- parameters.resultName = id;
- parameters.forwardResultTo = request.getContext().getResourceFile();
- parameters.forwardVoidTo = "error";
- parameters.forwardErrorTo = parameters.forwardResultTo;
- parameters.scope = Scope.REQUEST.name();
- request.pushNewBuffer();
- ActionForm.createForm(request, parameters);
- block.replaceContent(field, selector);
-
- request.appendHtml(request.popBuffer());
- }
- }
- }
-
- private String showSelectionList(final Request request, final String collectionId, final ObjectAdapter selectedItem, final boolean allowNotSet, final String type) {
- if (collectionId != null && !collectionId.equals("")) {
- final ObjectAdapter collection = request.getContext().getMappedObjectOrResult(collectionId);
- return showSelectionList(request, collection, selectedItem, allowNotSet, type);
- } else {
- return null;
- }
- }
-
- private String showSelectionList(final Request request, final ObjectAdapter collection, final ObjectAdapter selectedItem, final boolean allowNotSet, final String type) {
- final String field = request.getRequiredProperty(FIELD);
- final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
-
- if (type.equals("radio")) {
- return radioButtonList(request, field, allowNotSet, collection, selectedItem, facet);
- } else if (type.equals("list")) {
- final String size = request.getOptionalProperty("size", "5");
- return dropdownList(request, field, allowNotSet, collection, selectedItem, size, facet);
- } else if (type.equals("dropdown")) {
- return dropdownList(request, field, allowNotSet, collection, selectedItem, null, facet);
- } else {
- throw new UnknownTypeException(type);
- }
- }
-
- private String radioButtonList(final Request request, final String field, final boolean allowNotSet, final ObjectAdapter collection, final ObjectAdapter selectedItem, final CollectionFacet facet) {
- final RequestContext context = request.getContext();
- final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
- final StringBuffer buffer = new StringBuffer();
- if (allowNotSet) {
- buffer.append("<input type=\"radio\" name=\"" + field + "\" value=\"null\"></input><br/>\n");
- }
- while (iterator.hasNext()) {
- final ObjectAdapter element = iterator.next();
- final String elementId = context.mapObject(element, Scope.INTERACTION);
- final String title = element.titleString();
- final String checked = element == selectedItem ? "checked=\"checked\"" : "";
- buffer.append("<input type=\"radio\" name=\"" + field + "\" value=\"" + elementId + "\"" + checked + ">" + title + "</input><br/>\n");
- }
-
- return buffer.toString();
- }
-
- private String dropdownList(final Request request, final String field, final boolean allowNotSet, final ObjectAdapter collection, final ObjectAdapter selectedItem, String size, final CollectionFacet facet) {
- final RequestContext context = request.getContext();
- final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
- final StringBuffer buffer = new StringBuffer();
- size = size == null ? "" : " size =\"" + size + "\"";
- buffer.append("<select name=\"" + field + "\"" + size + " >\n");
- if (allowNotSet) {
- buffer.append(" <option value=\"null\"></option>\n");
- }
- while (iterator.hasNext()) {
- final ObjectAdapter element = iterator.next();
- final String elementId = context.mapObject(element, Scope.INTERACTION);
- final String title = element.titleString();
- final String checked = element == selectedItem ? "selected=\"selected\"" : "";
- buffer.append(" <option value=\"" + elementId + "\"" + checked + ">" + title + "</option>\n");
- }
- buffer.append("</select>\n");
- return buffer.toString();
- }
-
- @Override
- public String getName() {
- return "selector";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/ExcludeField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/ExcludeField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/ExcludeField.java
deleted file mode 100644
index 0c12990..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/ExcludeField.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.field;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class ExcludeField extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String field = request.getOptionalProperty(NAME);
- final InclusionList block = (InclusionList) request.getBlockContent();
- block.exclude(field);
- }
-
- @Override
- public String getName() {
- return "exclude";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/IncludeField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/IncludeField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/IncludeField.java
deleted file mode 100644
index bff9858..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/IncludeField.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.field;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class IncludeField extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String field = request.getOptionalProperty(NAME);
- final InclusionList block = (InclusionList) request.getBlockContent();
- block.include(field);
- }
-
- @Override
- public String getName() {
- return "include";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/InclusionList.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/InclusionList.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/InclusionList.java
deleted file mode 100644
index 1fdc2f6..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/InclusionList.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.field;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import com.google.common.collect.Lists;
-
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
-
-public class InclusionList implements BlockContent {
- private final Set<String> includedList = new HashSet<String>();
- private final Set<String> excludedList = new HashSet<String>();
-
- private boolean inIncludedList(final String fieldName) {
- return includedList.size() == 0 || includedList.contains(fieldName) || includedList.contains("all");
- }
-
- private boolean inExcludedList(final String fieldName) {
- return excludedList.contains(fieldName) || excludedList.contains("all");
- }
-
- public void include(final String field) {
- includedList.add(field);
- }
-
- public void exclude(final String field) {
- excludedList.add(field);
- }
-
- public List<ObjectAssociation> includedFields(final List<ObjectAssociation> originalFields) {
- final List<ObjectAssociation> includedFields = Lists.newArrayList();
- for (int i = 0; i < originalFields.size(); i++) {
- final String id2 = originalFields.get(i).getId();
- if (includes(id2)) {
- includedFields.add(originalFields.get(i));
- }
- }
-
- return includedFields;
- }
-
- public void hideExcludedParameters(final InputField[] inputFields) {
- for (final InputField inputField : inputFields) {
- final String id2 = inputField.getName();
- if (!includes(id2)) {
- inputField.setHidden(true);
- }
- }
- }
-
- public boolean includes(final String id) {
- return inIncludedList(id) && !inExcludedList(id);
- }
-
- public List<ObjectAction> includedActions(final List<ObjectAction> originalActions) {
- final List<ObjectAction> includedActions = Lists.newArrayList();
- for (int i = 0; i < originalActions.size(); i++) {
- final String id2 = originalActions.get(i).getId();
- if (includes(id2)) {
- includedActions.add(originalActions.get(i));
- }
- }
-
- return includedActions;
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkField.java
deleted file mode 100644
index 74a24e6..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkField.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.field;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class LinkField extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String field = request.getOptionalProperty(NAME);
- final String variable = request.getOptionalProperty(REFERENCE_NAME, RequestContext.RESULT);
- final String scope = request.getOptionalProperty(SCOPE, Scope.INTERACTION.toString());
- final String forwardView = request.getOptionalProperty(VIEW, "_generic." + Dispatcher.EXTENSION);
- final LinkedFieldsBlock tag = (LinkedFieldsBlock) request.getBlockContent();
- tag.link(field, variable, scope, forwardView);
- }
-
- @Override
- public String getName() {
- return "link";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedFieldsBlock.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedFieldsBlock.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedFieldsBlock.java
deleted file mode 100644
index 5049a3d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedFieldsBlock.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.field;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-
-public class LinkedFieldsBlock extends InclusionList {
- private final Map<String, LinkedObject> linkedFields = new HashMap<String, LinkedObject>();
-
- public void link(final String field, final String variable, final String scope, final String forwardView) {
- include(field);
- linkedFields.put(field, new LinkedObject(variable, scope, forwardView));
- }
-
- public LinkedObject[] linkedFields(final List<ObjectAssociation> fields) {
- final LinkedObject[] includedFields = new LinkedObject[fields.size()];
- for (int i = 0; i < fields.size(); i++) {
- final String id2 = fields.get(i).getId();
- if (fields.get(i).isOneToOneAssociation() && linkedFields.containsKey(id2)) {
- includedFields[i] = linkedFields.get(id2);
- }
- }
- return includedFields;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedObject.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedObject.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedObject.java
deleted file mode 100644
index d2c8548..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedObject.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.field;
-
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-
-public class LinkedObject {
- private final String variable;
- private final String scope;
- private String forwardView;
-
- public LinkedObject(final String variable, final String scope, final String forwardView) {
- this.variable = variable;
- this.scope = scope;
- this.forwardView = forwardView;
- }
-
- public LinkedObject(final String forwardView) {
- this.forwardView = forwardView;
- scope = Scope.INTERACTION.toString();
- variable = RequestContext.RESULT;
- }
-
- public String getVariable() {
- return variable;
- }
-
- public String getScope() {
- return scope;
- }
-
- public String getForwardView() {
- return forwardView;
- }
-
- public void setForwardView(final String path) {
- forwardView = path;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HiddenInputField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HiddenInputField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HiddenInputField.java
deleted file mode 100644
index 9245bc6..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HiddenInputField.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.form;
-
-import org.apache.commons.lang.StringEscapeUtils;
-
-public class HiddenInputField {
- private final String value;
- private final String name;
-
- public HiddenInputField(final String name, final String value) {
- this.value = value;
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public String getValue() {
- return StringEscapeUtils.escapeHtml(value);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HtmlFormBuilder.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HtmlFormBuilder.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HtmlFormBuilder.java
deleted file mode 100644
index fd44cc8..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HtmlFormBuilder.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.form;
-
-import org.apache.isis.core.commons.exceptions.UnknownTypeException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
-
-public class HtmlFormBuilder {
-
- public static void createForm(
- final Request request,
- final String action,
- final HiddenInputField[] hiddenFields,
- final InputField[] fields,
- final String className,
- final String id,
- final String formTitle,
- final String labelDelimiter,
- final String description,
- final String helpReference,
- final String buttonTitle,
- final String errors,
- final String cancelTo) {
-
- String classSegment = " class=\"" + className + (id == null ? "\"" : "\" id=\"" + id + "\"");
- request.appendHtml("<form " + classSegment + " action=\"" + action + "\" method=\"post\" accept-charset=\"UTF-8\">\n");
- if (formTitle != null && formTitle.trim().length() > 0) {
- classSegment = " class=\"title\"";
- request.appendHtml("<div" + classSegment + ">");
- request.appendAsHtmlEncoded(formTitle);
- request.appendHtml("</div>\n");
- }
-
- // TODO reinstate fieldsets when we can specify them
- // request.appendHtml("<fieldset>\n");
-
- final String cls = "errors";
- if (errors != null) {
- request.appendHtml("<div class=\"" + cls + "\">");
- request.appendAsHtmlEncoded(errors);
- request.appendHtml("</div>");
- }
- for (final HiddenInputField hiddenField : hiddenFields) {
- if (hiddenField == null) {
- continue;
- }
- request.appendHtml(" <input type=\"hidden\" name=\"" + hiddenField.getName() + "\" value=\"");
- request.appendAsHtmlEncoded(hiddenField.getValue());
- request.appendHtml("\" />\n");
- }
- request.appendHtml(request.getContext().interactionFields());
- for (final InputField fld : fields) {
- if (fld.isHidden()) {
- request.appendHtml(" <input type=\"hidden\" name=\"" + fld.getName() + "\" value=\"");
- request.appendAsHtmlEncoded(fld.getValue());
- request.appendHtml("\" />\n");
- } else {
- final String errorSegment = fld.getErrorText() == null ? "" : "<span class=\"error\">" + fld.getErrorText() + "</span>";
- final String fieldSegment = createField(fld);
- final String helpSegment = HelpLink.createHelpSegment(fld.getDescription(), fld.getHelpReference());
- final String title = fld.getDescription().equals("") ? "" : " title=\"" + fld.getDescription() + "\"";
- request.appendHtml(" <div class=\"field " + fld.getName() + "\"><label class=\"label\" " + title + ">");
- request.appendAsHtmlEncoded(fld.getLabel());
- request.appendHtml(labelDelimiter + "</label>" + fieldSegment + errorSegment + helpSegment + "</div>\n");
- }
- }
-
- request.appendHtml(" <input class=\"button\" type=\"submit\" value=\"");
- request.appendAsHtmlEncoded(buttonTitle);
- request.appendHtml("\" name=\"execute\" />\n");
- HelpLink.append(request, description, helpReference);
- // TODO alllow forms to be cancelled, returning to previous page.
- // request.appendHtml(" <div class=\"action\"><a class=\"button\" href=\"reset\">Cancel</a></div>");
-
- if (cancelTo != null) {
- request.appendHtml(" <input class=\"button\" type=\"button\" value=\"");
- request.appendAsHtmlEncoded("Cancel");
- request.appendHtml("\" onclick=\"window.location = '" + cancelTo + "'\" name=\"cancel\" />\n");
- }
-
- // TODO reinstate fieldsets when we can specify them
- // request.appendHtml("</fieldset>\n");
- request.appendHtml("</form>\n");
- }
-
- private static String createField(final InputField field) {
- if (field.isHidden()) {
- if (field.getType() == InputField.REFERENCE) {
- return createObjectField(field, "hidden");
- } else {
- return "";
- }
- } else {
- if (field.getType() == InputField.HTML) {
- return "<span class=\"value\">" + field.getHtml() + "</span>";
- } else if (field.getOptionsText() != null) {
- return createOptions(field);
- } else if (field.getType() == InputField.REFERENCE) {
- return createObjectField(field, "text");
- } else if (field.getType() == InputField.CHECKBOX) {
- return createCheckbox(field);
- } else if (field.getType() == InputField.PASSWORD) {
- return createPasswordField(field);
- } else if (field.getType() == InputField.TEXT) {
- if (field.getHeight() > 1) {
- return createTextArea(field);
- } else {
- return createTextField(field);
- }
- } else {
- throw new UnknownTypeException(field.toString());
- }
- }
- }
-
- private static String createObjectField(final InputField field, final String type) {
- return field.getHtml();
- }
-
- private static String createTextArea(final InputField field) {
- final String columnsSegment = field.getWidth() == 0 ? "" : " cols=\"" + field.getWidth() / field.getHeight() + "\"";
- final String rowsSegment = field.getHeight() == 0 ? "" : " rows=\"" + field.getHeight() + "\"";
- final String wrapSegment = !field.isWrapped() ? "" : " wrap=\"off\"";
- final String requiredSegment = !field.isRequired() ? "" : " class=\"required\"";
- final String disabled = field.isEditable() ? "" : " disabled=\"disabled\"";
- final String maxLength = field.getMaxLength() == 0 ? "" : " maxlength=\"" + field.getMaxLength() + "\"";
- return "<textarea" + requiredSegment + " name=\"" + field.getName() + "\"" + columnsSegment + rowsSegment + wrapSegment
- + maxLength + disabled + ">" + Request.getEncoder().encoder(field.getValue()) + "</textarea>";
- }
-
- private static String createPasswordField(final InputField field) {
- final String extra = " autocomplete=\"off\"";
- return createTextField(field, "password", extra);
- }
-
- private static String createTextField(final InputField field) {
- return createTextField(field, "text", "");
- }
-
- private static String createTextField(final InputField field, final String type, final String additionalAttributes) {
- final String value = field.getValue();
- final String valueSegment = value == null ? "" : " value=\"" + Request.getEncoder().encoder(value) + "\"";
- final String lengthSegment = field.getWidth() == 0 ? "" : " size=\"" + field.getWidth() + "\"";
- final String maxLengthSegment = field.getMaxLength() == 0 ? "" : " maxlength=\"" + field.getMaxLength() + "\"";
- final String requiredSegment = !field.isRequired() ? "" : " required";
- final String disabled = field.isEditable() ? "" : " disabled=\"disabled\"";
- return "<input class=\"" + field.getDataType() + requiredSegment + "\" type=\"" + type + "\" name=\"" + field.getName() + "\"" +
- valueSegment + lengthSegment + maxLengthSegment + disabled + additionalAttributes + " />";
- }
-
- private static String createCheckbox(final InputField field) {
- final String entryText = field.getValue();
- final String valueSegment = entryText != null && entryText.toLowerCase().equals("true") ? " checked=\"checked\"" : "";
- final String disabled = field.isEditable() ? "" : " disabled=\"disabled\"";
- return "<input type=\"checkbox\" name=\"" + field.getName() + "\" value=\"true\" " + valueSegment + disabled + " />";
- }
-
- private static String createOptions(final InputField field) {
- final String[] options = field.getOptionsText();
- final String[] ids = field.getOptionValues();
- final int length = options.length;
- final String classSegment = field.isRequired() && length == 0 ? " class=\"required\"" : "";
- final String disabled = field.isEditable() ? "" : " disabled=\"disabled\"";
- final StringBuffer str = new StringBuffer();
- str.append("\n <select name=\"" + field.getName() + "\"" + disabled + classSegment + ">\n");
- boolean offerOther = false;
- for (int i = 0; i < length; i++) {
- final String selectedSegment = field.getValue() == null || ids[i].equals(field.getValue()) ? " selected=\"selected\"" : "";
- if (field.getType() == InputField.TEXT && options[i].equals("__other")) {
- offerOther = true;
- } else {
- str.append(" <option value=\"" + Request.getEncoder().encoder(ids[i]) + "\"" + selectedSegment + ">" + Request.getEncoder().encoder(options[i]) + "</option>\n");
- }
- }
- if (!field.isRequired() || length == 0) {
- final String selectedSegment = field.getValue() == null || field.getValue().equals("") ? " selected=\"selected\"" : "";
- str.append(" <option value=\"null\"" + selectedSegment + "></option>\n");
- }
- if (offerOther) {
- str.append(" <option value=\"-OTHER-\">Other:</option>\n");
- }
- str.append(" </select>");
- if (field.getType() == InputField.TEXT) {
- final String lengthSegment = field.getWidth() == 0 ? "" : " size=\"" + field.getWidth() + "\"";
- final String hideSegment = " style=\"display: none;\" "; // TODO
- // only
- // hide
- // when JS
- // enabled
- str.append(" <input type=\"text\" name=\"" + field.getName() + "-other\"" + hideSegment + lengthSegment + disabled + " />");
- }
- str.append("\n");
- return str.toString();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/InputField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/InputField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/InputField.java
deleted file mode 100644
index 0382cc4..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/InputField.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.form;
-
-import org.apache.isis.core.commons.util.ToString;
-
-public class InputField {
- public static final int REFERENCE = 1;
- public static final int TEXT = 2;
- public static final int PASSWORD = 3;
- public static final int CHECKBOX = 4;
- public static final int HTML = 5;
-
- private int type;
-
- private String label;
- private String description = "";
- private String helpReference;
- private String errorText;
- private final String name;
- private String dataType;
-
- private int maxLength = 0;
- private int width;
- private int height = 1;
- private boolean isWrapped = false;
-
- private boolean isRequired = true;
- private boolean isEditable = true;
- private boolean isHidden = false;
-
- private String[] optionsText;
- private String[] optionValues;
-
- private String value;
- private String html;
-
- public InputField(final String name) {
- this.name = name;
- }
-
- public String getErrorText() {
- return errorText;
- }
-
- public String getDescription() {
- return description;
- }
-
- public String getDataType() {
- return dataType;
- }
-
- public String getHelpReference() {
- return helpReference;
- }
-
- public String getLabel() {
- return label;
- }
-
- public String getName() {
- return name;
- }
-
- public boolean isEditable() {
- return isEditable;
- }
-
- public String getValue() {
- return value;
- }
-
- public String getHtml() {
- return html;
- }
-
- public boolean isHidden() {
- return isHidden;
- }
-
- public String[] getOptionsText() {
- return optionsText;
- }
-
- public String[] getOptionValues() {
- return optionValues;
- }
-
- public int getWidth() {
- return width;
- }
-
- public int getHeight() {
- return height;
- }
-
- public boolean isWrapped() {
- return isWrapped;
- }
-
- public boolean isRequired() {
- return isRequired;
- }
-
- public int getMaxLength() {
- return maxLength;
- }
-
- public int getType() {
- return type;
- }
-
- public void setErrorText(final String errorText) {
- this.errorText = errorText;
- }
-
- public void setDescription(final String description) {
- this.description = description;
- }
-
- public void setHelpReference(final String helpReference) {
- this.helpReference = helpReference;
- }
-
- public void setLabel(final String label) {
- this.label = label;
- }
-
- public void setEditable(final boolean isEditable) {
- this.isEditable = isEditable;
- isRequired = isRequired && isEditable;
- }
-
- public void setValue(final String entryText) {
- this.value = entryText;
- }
-
- public void setHtml(final String html) {
- this.html = html;
- }
-
- public void setHidden(final boolean isHidden) {
- this.isHidden = isHidden;
- }
-
- public void setWidth(final int width) {
- this.width = width;
- }
-
- public void setOptions(final String[] optionsText, final String[] optionValues) {
- this.optionsText = optionsText;
- this.optionValues = optionValues;
- }
-
- public void setHeight(final int height) {
- this.height = height;
- }
-
- public void setWrapped(final boolean isWrapped) {
- this.isWrapped = isWrapped;
- }
-
- public void setRequired(final boolean isRequired) {
- this.isRequired = isRequired;
- }
-
- public void setMaxLength(final int maxLength) {
- this.maxLength = maxLength;
- }
-
- public void setType(final int type) {
- this.type = type;
- }
-
- public void setDataType(String dataType) {
- this.dataType = dataType;
- }
-
- @Override
- public String toString() {
- final ToString str = new ToString(this);
- str.append("name", name);
- String typeName;
- switch (type) {
- case CHECKBOX:
- typeName = "checkbox";
- break;
- case REFERENCE:
- typeName = "reference";
- break;
- case TEXT:
- typeName = "text";
- break;
- default:
- typeName = "unset";
- break;
- }
- str.append("type", typeName);
- str.append("datatype", dataType);
- str.append("editable", isEditable);
- str.append("hidden", isHidden);
- str.append("required", isRequired);
- return str.toString();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logoff.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logoff.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logoff.java
deleted file mode 100644
index 1632f5d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logoff.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.logon.LogoutAction;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Logoff extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- LogoutAction.logoutUser(request.getContext());
- }
-
- @Override
- public String getName() {
- return "logoff";
- }
-
-}
[23/59] [abbrv] isis git commit: ISIS-789: Merging in
https://github.com/apache/isis/pull/27 (jdbranham/master) for upgrading JDO
Objectstore to 4.0.4.
Posted by da...@apache.org.
ISIS-789: Merging in https://github.com/apache/isis/pull/27 (jdbranham/master) for upgrading JDO Objectstore to 4.0.4.
Have excluded changes to neoapp and simpleapp (will add as separate commits).
Resolved conflicts:
core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/30a4cb67
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/30a4cb67
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/30a4cb67
Branch: refs/heads/ISIS-789
Commit: 30a4cb674607ce522d4b9852c932e03e924f1bff
Parents: 2c7cfbf 0d223de
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Mar 30 14:55:16 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Mar 30 14:55:16 2015 +0100
----------------------------------------------------------------------
core/applib/pom.xml | 2 +-
...DatanucleusPersistableTypesFacetFactory.java | 14 ++
.../RemoveDnPrefixedMethodsFacetFactory.java | 28 +++
.../classsubstitutor/ClassSubstitutor.java | 4 +
.../dflt/ProgrammingModelFacetsJava5.java | 5 +
core/pom.xml | 8 +-
.../IdentifierGeneratorForDataNucleus.java | 4 +-
.../system/persistence/PersistenceSession.java | 2 +-
.../DataNucleusApplicationComponents.java | 42 ++--
.../jdo/datanucleus/DataNucleusObjectStore.java | 10 +-
...ataNucleusPersistenceMechanismInstaller.java | 18 +-
.../IsisConfigurationForJdoIntegTests.java | 11 +-
.../jdo/datanucleus/JDOStateManagerForIsis.java | 92 +++++++--
.../persistence/FrameworkSynchronizer.java | 42 ++--
.../persistence/IsisLifecycleListener.java | 19 +-
.../jdo/datanucleus/persistence/Utils.java | 14 +-
.../PersistenceQueryProcessorAbstract.java | 9 +-
.../persistence/spi/JdoObjectIdSerializer.java | 202 ++++++++-----------
.../datanucleus/valuetypes/IsisDateMapping.java | 9 +-
.../valuetypes/IsisDateTimeMapping.java | 9 +-
tck/pom.xml | 7 +-
tck/tck-dom/pom.xml | 2 +-
.../spi/JdoObjectIdSerializerTest.java | 14 +-
23 files changed, 338 insertions(+), 229 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/30a4cb67/core/pom.xml
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/30a4cb67/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
----------------------------------------------------------------------
diff --cc core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
index c92bae9,013041e..92ea2b5
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
@@@ -26,10 -27,10 +27,10 @@@ import javax.jdo.FetchGroup
import javax.jdo.FetchPlan;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
- import javax.jdo.spi.PersistenceCapable;
+
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-
+import org.datanucleus.api.jdo.NucleusJDOHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
http://git-wip-us.apache.org/repos/asf/isis/blob/30a4cb67/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
----------------------------------------------------------------------
diff --cc core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
index 21e6882,d511f10..37ff550
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
@@@ -19,21 -19,19 +19,18 @@@
package org.apache.isis.objectstore.jdo.datanucleus;
- import javax.jdo.spi.PersistenceCapable;
- import javax.jdo.spi.StateManager;
-
import org.datanucleus.ExecutionContext;
import org.datanucleus.cache.CachedPC;
+ import org.datanucleus.enhancer.Persistable;
import org.datanucleus.metadata.AbstractClassMetaData;
import org.datanucleus.state.ObjectProvider;
- import org.datanucleus.state.ReferentialJDOStateManager;
+ import org.datanucleus.state.ReferentialStateManagerImpl;
import org.datanucleus.store.FieldValues;
import org.datanucleus.store.fieldmanager.FieldManager;
-
import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.objectstore.jdo.datanucleus.service.eventbus.EventBusServiceJdo;
- public class JDOStateManagerForIsis extends ReferentialJDOStateManager implements StateManager, ObjectProvider {
+ public class JDOStateManagerForIsis extends ReferentialStateManagerImpl {
public JDOStateManagerForIsis(ExecutionContext ec, AbstractClassMetaData cmd) {
super(ec, cmd);
[13/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Mark.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Mark.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Mark.java
deleted file mode 100644
index febafb6..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Mark.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Mark extends AbstractElementProcessor {
-
- // TODO the return points should be pushed on to a stack so that there is
- // traceable history.
- @Override
- public void process(final Request request) {
- // String name = request.getOptionalProperty(NAME);
- final RequestContext context = request.getContext();
- context.addVariable("_return-to", context.getUri(), Scope.SESSION);
- }
-
- @Override
- public String getName() {
- return "mark";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/NewActionLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/NewActionLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/NewActionLink.java
deleted file mode 100644
index 5929f81..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/NewActionLink.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-public class NewActionLink extends AbstractLink {
-
- // REVIEW: confirm this rendering context
- private final Where where = Where.OBJECT_FORMS;
-
- @Override
- protected boolean valid(final Request request, final ObjectAdapter object) {
- final String method = request.getRequiredProperty(METHOD);
- final ObjectAction action = MethodsUtils.findAction(object, method);
- return MethodsUtils.isVisibleAndUsable(object, action, where);
- }
-
- @Override
- protected String linkLabel(final String name, final ObjectAdapter object) {
- return "run";
- }
-
- @Override
- protected String defaultView() {
- return "_generic_action." + Dispatcher.EXTENSION;
- }
-
- @Override
- protected String additionalParameters(final Request request) {
- final String method = request.getRequiredProperty(METHOD);
- return "method=" + method;
- }
-
- @Override
- public String getName() {
- return "new-action-link";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
deleted file mode 100644
index f2726bf..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import java.util.List;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class ObjectLink extends AbstractLink {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- protected boolean valid(final Request request, final ObjectAdapter object) {
- final AuthenticationSession session = IsisContext.getAuthenticationSession();
- final List<ObjectAssociation> visibleFields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, object, where));
- return visibleFields.size() > 0;
- }
-
- @Override
- protected String linkLabel(final String name, final ObjectAdapter object) {
- if (name == null) {
- return object.titleString();
- } else {
- return name;
- }
- }
-
- @Override
- protected String defaultView() {
- return Dispatcher.GENERIC + "." + Dispatcher.EXTENSION;
- }
-
- @Override
- public String getName() {
- return "object-link";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/PageTitle.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/PageTitle.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/PageTitle.java
deleted file mode 100644
index 10c3b13..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/PageTitle.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class PageTitle extends Variable {
- @Override
- public void process(final Request request) {
- process(request, "title", null, null, false, Scope.REQUEST);
- }
-
- @Override
- public String getName() {
- return "page-title";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Redirect.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Redirect.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Redirect.java
deleted file mode 100644
index 6f3b0d8..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Redirect.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Redirect extends AbstractElementProcessor {
-
- @Override
- public String getName() {
- return "redirect";
- }
-
- @Override
- public void process(final Request request) {
- final String view = request.getRequiredProperty(VIEW);
- request.getContext().redirectTo(view);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
deleted file mode 100644
index 3321b87..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import java.util.List;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.*;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.RemoveAction;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-public class RemoveElement extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final static Where where = Where.ANYWHERE;
-
- @Override
- public void process(final Request request) {
- final String title = request.getOptionalProperty(BUTTON_TITLE, "Remove From List");
- final String cls = request.getOptionalProperty(CLASS, "action in-line delete confirm");
- final String object = request.getOptionalProperty(OBJECT);
- final String resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
- final RequestContext context = request.getContext();
- final String objectId = object != null ? object : (String) context.getVariable(RequestContext.RESULT);
- final ObjectAdapter adapter = MethodsUtils.findObject(context, objectId);
-
- final String element = request.getOptionalProperty(ELEMENT, (String) context.getVariable(ELEMENT));
- final ObjectAdapter elementId = MethodsUtils.findObject(context, element);
-
- final String fieldName = request.getRequiredProperty(FIELD);
-
- String view = request.getOptionalProperty(VIEW);
- view = context.fullFilePath(view == null ? context.getResourceFile() : view);
- String error = request.getOptionalProperty(ERROR);
- error = context.fullFilePath(error == null ? context.getResourceFile() : error);
-
- request.processUtilCloseTag();
-
- write(request, adapter, fieldName, elementId, resultOverride, view, error, title, cls);
- }
-
- @Override
- public String getName() {
- return "remove-element";
- }
-
- public static void write(final Request request, final ObjectAdapter adapter, final String fieldName, final ObjectAdapter element, final String resultOverride, final String view, final String error, final String title, final String cssClass) {
- final ObjectAssociation field = adapter.getSpecification().getAssociation(fieldName);
- if (field == null) {
- throw new ScimpiException("No field " + fieldName + " in " + adapter.getSpecification().getFullIdentifier());
- }
- if (!field.isOneToManyAssociation()) {
- throw new ScimpiException("Field " + fieldName + " not a collection, in " + adapter.getSpecification().getFullIdentifier());
- }
- if (field.isVisible(IsisContext.getAuthenticationSession(), adapter, where).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
- ResolveFieldUtil.resolveField(adapter, field);
-
- Consent usable = field.isUsable(IsisContext.getAuthenticationSession(), adapter, where);
- if (usable.isAllowed()) {
- usable = ((OneToManyAssociation) field).isValidToRemove(adapter, element);
- }
-
- if (usable.isVetoed()) {
- request.appendHtml("<div class=\"" + cssClass + " disabled-form\">");
- request.appendHtml("<div class=\"button disabled\" title=\"");
- request.appendAsHtmlEncoded(usable.getReason());
- request.appendHtml("\" >" + title);
- request.appendHtml("</div>");
- request.appendHtml("</div>");
- } else {
- if (valid(request, adapter)) {
- final String classSegment = " class=\"" + cssClass + "\"";
-
- final String objectId = request.getContext().mapObject(adapter, Scope.INTERACTION);
- final String elementId = request.getContext().mapObject(element, Scope.INTERACTION);
- final String action = RemoveAction.ACTION + Dispatcher.COMMAND_ROOT;
- request.appendHtml("<form" + classSegment + " method=\"post\" action=\"" + action + "\" >");
- request.appendHtml("<input type=\"hidden\" name=\"" + OBJECT + "\" value=\"" + objectId + "\" />");
- request.appendHtml("<input type=\"hidden\" name=\"" + FIELD + "\" value=\"" + fieldName + "\" />");
- request.appendHtml("<input type=\"hidden\" name=\"" + ELEMENT + "\" value=\"" + elementId + "\" />");
- if (resultOverride != null) {
- request.appendHtml("<input type=\"hidden\" name=\"" + RESULT_OVERRIDE + "\" value=\"" + resultOverride + "\" />");
- }
- request.appendHtml("<input type=\"hidden\" name=\"" + VIEW + "\" value=\"" + view + "\" />");
- request.appendHtml("<input type=\"hidden\" name=\"" + ERROR + "\" value=\"" + error + "\" />");
- request.appendHtml(request.getContext().interactionFields());
- request.appendHtml("<input class=\"button\" type=\"submit\" value=\"" + title + "\" />");
- request.appendHtml("</form>");
- }
- }
- }
-
- private static boolean valid(final Request request, final ObjectAdapter adapter) {
- // TODO is this check valid/necessary?
-
- // TODO check is valid to remove element
- final AuthenticationSession session = IsisContext.getAuthenticationSession();
- final Filter<ObjectAssociation> filter = ObjectAssociation.Filters.dynamicallyVisible(session, adapter, where);
- final List<ObjectAssociation> visibleFields = adapter.getSpecification().getAssociations(Contributed.EXCLUDED, filter);
- if (visibleFields.size() == 0) {
- return false;
- }
-
- return true;
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ScopeTag.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ScopeTag.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ScopeTag.java
deleted file mode 100644
index 2dced50..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ScopeTag.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class ScopeTag extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String name = request.getRequiredProperty(NAME);
- final String scopeName = request.getRequiredProperty(SCOPE);
- final Scope scope = RequestContext.scope(scopeName);
- request.processUtilCloseTag();
- changeScope(request, name, scope);
- }
-
- protected static void changeScope(final Request request, final String name, final Scope scope) {
- request.getContext().changeScope(name, scope);
- final Object value = request.getContext().getVariable(name);
- if (value != null) {
- request.getContext().addVariable(name, value, scope);
- }
- }
-
- @Override
- public String getName() {
- return "scope";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookie.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookie.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookie.java
deleted file mode 100644
index 1014280..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookie.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.action.RequiredPropertyException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class SetCookie extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String name = request.getRequiredProperty("name");
- final String value = request.getOptionalProperty("value");
- final boolean isClear = request.getOptionalProperty("action", "set").equals("clear");
- final String expiresString = request.getOptionalProperty("expires", "-1");
-
- if (!isClear && value == null) {
- throw new RequiredPropertyException("Property not set: " + value);
- }
- if (isClear) {
- request.appendDebug("cookie: " + name + " (cleared)");
- request.getContext().addCookie(name, null, 0);
- } else {
- if (value.length() > 0) {
- request.appendDebug("cookie: " + name + " set to"+ value);
- request.getContext().addCookie(name, value, Integer.valueOf(expiresString));
- }
- }
- }
-
- @Override
- public String getName() {
- return "set-cookie";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookieFromField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookieFromField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookieFromField.java
deleted file mode 100644
index b91261c..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookieFromField.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class SetCookieFromField extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- throw new NotYetImplementedException("3.1");
- /*
- * String objectId = request.getOptionalProperty(OBJECT); String
- * fieldName = request.getRequiredProperty(FIELD);
- *
- * ObjectAdapter object = (ObjectAdapter)
- * request.getContext().getMappedObjectOrResult(objectId);
- * ObjectAssociation field =
- * object.getSpecification().getField(fieldName); if (field.isValue()) {
- * throw new ScimpiException("Can only set up a value field"); }
- * ObjectAdapter value = field.get(object); if (value != null) { String
- * title = value.titleString();
- *
- * if (title.length() > 0) { String name =
- * request.getRequiredProperty(NAME); String expiresString =
- * request.getOptionalProperty("expires", "-1");
- * request.getContext().addCookie(name, title,
- * Integer.valueOf(expiresString)); } }
- */
- }
-
- @Override
- public String getName() {
- return "set-cookie-from-field";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetFieldFromCookie.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetFieldFromCookie.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetFieldFromCookie.java
deleted file mode 100644
index 89702fa..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetFieldFromCookie.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class SetFieldFromCookie extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- throw new NotYetImplementedException("3.1");
- /*
- * String name = request.getRequiredProperty(NAME); String cookieString
- * = request.getContext().getCookie(name); ObjectAdapter valueAdapter =
- * IsisContext.getObjectPersistor().createAdapterForValue(cookieString);
- *
- * String objectId = request.getOptionalProperty(OBJECT); String
- * fieldName = request.getRequiredProperty(FIELD); ObjectAdapter object
- * = (ObjectAdapter)
- * request.getContext().getMappedObjectOrResult(objectId);
- * ObjectAssociation field =
- * object.getSpecification().getField(fieldName); if (field.isValue()) {
- * throw new ScimpiException("Can only set up a value field"); }
- *
- * ((ValueAssociation) field).setValue(object, valueAdapter);
- */
- }
-
- @Override
- public String getName() {
- return "set-field-from-cookie";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetLocalization.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetLocalization.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetLocalization.java
deleted file mode 100644
index d8f79f6..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetLocalization.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import java.util.Locale;
-import java.util.TimeZone;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-/**
- * Displays the localization data for the current user.
- */
-public class SetLocalization extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- request.closeEmpty();
-
- final String localeCode = request.getRequiredProperty("locale");
- final String timeZone = request.getRequiredProperty("time-zone");
-
- String country;
- String language;
- int pos = localeCode.indexOf('_');
- if (pos == 1) {
- language = localeCode;
- country = "";
- } else {
- language = localeCode.substring(0, pos);
- country = localeCode.substring(pos + 1);
- }
-
- Locale l = new Locale(language, country);
- TimeZone t = TimeZone.getTimeZone(timeZone);
- // IsisContext.getUserProfile().setLocalization(new UserLocalization(l, t));
-
- }
-
- @Override
- public String getName() {
- return "alpha-set-localization";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SimpleButton.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SimpleButton.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SimpleButton.java
deleted file mode 100644
index 1efd7bf..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SimpleButton.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class SimpleButton extends AbstractElementProcessor {
- @Override
- public void process(final Request request) {
- final String href = request.getRequiredProperty("href");
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String text = request.popBuffer();
- request.appendHtml("<div class=\"action\"><a class=\"button\" href=\"" + href + "\">" + text + "</a></div>");
- }
-
- @Override
- public String getName() {
- return "button";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/StartSession.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/StartSession.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/StartSession.java
deleted file mode 100644
index 493c33a..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/StartSession.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class StartSession extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- request.getContext().startHttpSession();
- }
-
- @Override
- public String getName() {
- return "start-session";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/TemplateTag.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/TemplateTag.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/TemplateTag.java
deleted file mode 100644
index 8860780..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/TemplateTag.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class TemplateTag implements ElementProcessor {
-
- @Override
- public String getName() {
- return "template";
- }
-
- @Override
- public void process(final Request request) {
- // REVIEW this make IE8 render poorly as the browser doesn't think a
- // DOCTYPE is provided, causing it to run in
- // quirk mode
- // request.appendHtml("<!-- zz apply template " +
- // request.getOptionalProperty("file") + " -->");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Unless.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Unless.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Unless.java
deleted file mode 100644
index 9dcf810..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Unless.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Unless extends AbstractConditionalBlock {
-
- @Override
- protected void processTags(final boolean isSet, final Request request) {
- if (isSet) {
- request.skipUntilClose();
- request.appendDebug(" skipping segment");
- } else {
- request.processUtilCloseTag();
- }
- }
-
- @Override
- public String getName() {
- return "unless";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Variable.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Variable.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Variable.java
deleted file mode 100644
index 960fc6b..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Variable.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Variable extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String name = request.getOptionalProperty(NAME);
- final String value = request.getOptionalProperty(VALUE);
- final String defaultTo = request.getOptionalProperty(DEFAULT);
- final String scopeName = request.getOptionalProperty(SCOPE);
- final boolean isClear = request.getOptionalProperty("action", "set").equals("clear");
- final Scope scope = RequestContext.scope(scopeName, isClear ? Scope.SESSION : Scope.REQUEST);
- process(request, name, value, defaultTo, isClear, scope);
- }
-
- protected void process(final Request request, final String name, final String value, final String defaultTo, final boolean isClear, final Scope scope) {
- request.pushNewBuffer();
- request.processUtilCloseTag();
- String source = request.popBuffer();
- if (isClear) {
- request.appendDebug("variable: " + name + " (cleared)");
- request.getContext().clearVariable(name, scope);
- } else {
- if (source.length() == 0 && value != null) {
- source = value;
- }
- if (source.length() == 0) {
- source = defaultTo;
- }
- request.appendDebug(" " + name + " (" + scope + ") set to " + source);
- request.getContext().addVariable(name, source, scope);
- }
- }
-
- @Override
- public String getName() {
- return "variable";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/When.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/When.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/When.java
deleted file mode 100644
index cc1fd09..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/When.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class When extends AbstractConditionalBlock {
-
- @Override
- protected void processTags(final boolean isSet, final Request request) {
- if (isSet) {
- request.processUtilCloseTag();
- } else {
- request.appendDebug(" skipping segment");
- request.skipUntilClose();
- }
- }
-
- @Override
- public String getName() {
- return "when";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ActionName.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ActionName.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ActionName.java
deleted file mode 100644
index 119a453..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ActionName.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.value;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-// TODO do the same for description and help, and for fields
-public class ActionName extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String objectId = request.getOptionalProperty(OBJECT);
- final String methodName = request.getRequiredProperty(METHOD);
-
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
- final ObjectAction action = MethodsUtils.findAction(object, methodName);
-
- request.appendAsHtmlEncoded(action.getName());
- }
-
- @Override
- public String getName() {
- return "action-name";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/CountElements.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/CountElements.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/CountElements.java
deleted file mode 100644
index debaa49..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/CountElements.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.value;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class CountElements extends AbstractObjectProcessor {
-
- @Override
- protected void process(final Request request, final ObjectAdapter collection) {
- final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
- final int size = facet.size(collection);
- if (size == 0) {
- request.appendHtml(request.getOptionalProperty("none", "0"));
- } else if (size == 1) {
- request.appendHtml(request.getOptionalProperty("one", "1"));
- } else {
- final String text = request.getOptionalProperty("many", "" + size);
- request.appendHtml(String.format(text, size));
- }
- }
-
- @Override
- protected String checkFieldType(final ObjectAssociation objectField) {
- return objectField.isOneToManyAssociation() ? null : "must be a collection";
- }
-
- @Override
- public String getName() {
- return "count";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ElementType.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ElementType.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ElementType.java
deleted file mode 100644
index c7284a0..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ElementType.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.value;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class ElementType extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- ObjectAdapter collection;
- final String field = request.getOptionalProperty(FIELD);
- final RequestContext context = request.getContext();
- if (field != null) {
- final String id = request.getRequiredProperty(OBJECT);
- final ObjectAdapter object = context.getMappedObjectOrResult(id);
- final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
- if (!objectField.isOneToManyAssociation()) {
- throw new ScimpiException("Field " + objectField.getId() + " is not a collection");
- }
- collection = objectField.get(object);
- } else {
- final String id = request.getOptionalProperty(COLLECTION);
- collection = context.getMappedObjectOrResult(id);
- }
-
- final ObjectSpecification elementSpecification = collection.getElementSpecification();
- final String name = elementSpecification.getSingularName();
-
- request.appendAsHtmlEncoded(name);
- }
-
- @Override
- public String getName() {
- return "element-type";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/FieldName.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/FieldName.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/FieldName.java
deleted file mode 100644
index ed054a1..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/FieldName.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.value;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class FieldName extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- public void process(final Request request) {
- final String id = request.getOptionalProperty(OBJECT);
- final String fieldName = request.getRequiredProperty(FIELD);
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
- if (field == null) {
- throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
- }
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
- request.appendAsHtmlEncoded(field.getName());
- }
-
- @Override
- public String getName() {
- return "field-name";
- }
-
- public static void write(final Request content, final ObjectAssociation field) {
- content.appendHtml("<span class=\"label\" title=\"" + field.getDescription() + "\">");
- content.appendHtml("</span>");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ParameterName.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ParameterName.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ParameterName.java
deleted file mode 100644
index 84e2204..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ParameterName.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.value;
-
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-public class ParameterName extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String objectId = request.getOptionalProperty(OBJECT);
- final String methodName = request.getRequiredProperty(METHOD);
- final String field = request.getOptionalProperty(PARAMETER_NUMBER);
-
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
- final ObjectAction action = MethodsUtils.findAction(object, methodName);
- final List<ObjectActionParameter> parameters = action.getParameters();
-
- int index;
- if (field == null) {
- index = 0;
- } else {
- index = Integer.valueOf(field).intValue() - 1;
- }
- if (index < 0 || index >= parameters.size()) {
- throw new ScimpiException("Parameter numbers should be between 1 and " + parameters.size() + ": " + index);
- }
-
- request.appendAsHtmlEncoded(parameters.get(index).getName());
- }
-
- @Override
- public String getName() {
- return "parameter-name";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/TitleString.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/TitleString.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/TitleString.java
deleted file mode 100644
index 6b2078a..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/TitleString.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.value;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-/**
- *
- */
-public class TitleString extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String id = request.getOptionalProperty(OBJECT);
- final String fieldName = request.getOptionalProperty(FIELD);
- final int truncateTo = Integer.valueOf(request.getOptionalProperty(TRUNCATE, "0")).intValue();
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
- if (object == null) {
- return;
- }
- String titleString;
- if (fieldName == null) {
- titleString = object.titleString();
- } else {
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
- final ObjectAdapter fieldReference = field.get(object);
- if (fieldReference != null) {
- titleString = fieldReference.titleString();
- } else {
- titleString = "";
- }
- }
- request.appendDebug(" " + titleString);
- request.appendTruncated(titleString, truncateTo);
- }
-
- @Override
- public String getName() {
- return "title-string";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/Type.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/Type.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/Type.java
deleted file mode 100644
index 9c7861d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/Type.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.value;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Type extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final RequestContext context = request.getContext();
- final String showPlural = request.getOptionalProperty(PLURAL);
- final String id = request.getOptionalProperty(OBJECT);
- final String objectId = id != null ? id : (String) context.getVariable(RequestContext.RESULT);
-
- ObjectAdapter object = context.getMappedObjectOrResult(objectId);
- final String field = request.getOptionalProperty(FIELD);
- if (field != null) {
- final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
- object = objectField.get(object);
- }
- request.appendDebug(" for " + object);
-
- final ObjectSpecification specification = object.getSpecification();
- final String name = showPlural != null ? specification.getPluralName() : specification.getSingularName();
-
- request.appendAsHtmlEncoded(name);
- }
-
- @Override
- public String getName() {
- return "type";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/pom.xml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/pom.xml b/component/viewer/scimpi/pom.xml
deleted file mode 100644
index 300d60d..0000000
--- a/component/viewer/scimpi/pom.xml
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<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>
-
- <parent>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
- <relativePath>../../../core/pom.xml</relativePath>
- </parent>
-
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-scimpi</artifactId>
- <version>1.0.0-SNAPSHOT</version>
-
- <name>Isis Scimpi Viewer</name>
-
- <packaging>pom</packaging>
-
- <properties>
- <siteBaseDir>.</siteBaseDir>
- <relativeUrl/>
- </properties>
-
- <!-- used in Site generation for relative references. -->
- <url>http://isis.apache.org/${relativeUrl}</url>
-
- <build>
- <pluginManagement>
- <plugins>
- <!-- Apache Release Audit Tool -->
- <plugin>
- <groupId>org.apache.rat</groupId>
- <artifactId>apache-rat-plugin</artifactId>
- <version>0.10</version>
- <configuration>
- <excludes>
- <!--
- overriding inherited excludes from oia.core:isis
- with a more specific set for this component
- -->
- <exclude>**/target/**</exclude>
- <exclude>**/target-ide/**</exclude>
-
- <exclude>**/*.project</exclude>
- <exclude>**/.classpath</exclude>
- <exclude>**/.settings/**</exclude>
- </excludes>
- </configuration>
- </plugin>
- </plugins>
- </pluginManagement>
- </build>
-
- <reporting>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-project-info-reports-plugin</artifactId>
- <inherited>false</inherited>
- <reportSets>
- <reportSet>
- <inherited>false</inherited>
- <reports>
- <report>dependency-management</report>
- <report>plugins</report>
- <report>modules</report>
- <report>summary</report>
- </reports>
- </reportSet>
- </reportSets>
- </plugin>
- </plugins>
- </reporting>
-
- <dependencyManagement>
- <dependencies>
-
- <!-- for benefit of application developers, using scope=import -->
-
- <dependency>
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-scimpi-dispatcher</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- </dependency>
-
- <dependency>
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-scimpi-servlet</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- </dependency>
-
- <dependency>
- <!-- defined here because other Isis modules do not depend upon it -->
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.6</version>
- </dependency>
-
- <dependency>
- <groupId>org.json</groupId>
- <artifactId>json</artifactId>
- <version>20140107</version>
- </dependency>
-
- </dependencies>
- </dependencyManagement>
-
- <modules>
- <module>dispatcher</module>
- <module>servlet</module>
- </modules>
-</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/servlet/pom.xml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/servlet/pom.xml b/component/viewer/scimpi/servlet/pom.xml
deleted file mode 100644
index 1600dd7..0000000
--- a/component/viewer/scimpi/servlet/pom.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-scimpi</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>isis-viewer-scimpi-servlet</artifactId>
-
- <name>Isis Scimpi Viewer Servlet</name>
-
- <properties>
- <siteBaseDir>..</siteBaseDir>
- <relativeUrl>servlet/</relativeUrl>
- </properties>
-
- <!-- used in Site generation for relative references. -->
- <url>http://isis.apache.org/${relativeUrl}</url>
-
- <reporting>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-project-info-reports-plugin</artifactId>
- <inherited>false</inherited>
- <configuration>
- <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
- </configuration>
- <reportSets>
- <reportSet>
- <inherited>false</inherited>
- <reports>
- <report>dependencies</report>
- <report>dependency-convergence</report>
- <report>plugins</report>
- <report>summary</report>
- </reports>
- </reportSet>
- </reportSets>
- </plugin>
- </plugins>
- </reporting>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-scimpi-dispatcher</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.geronimo.specs</groupId>
- <artifactId>geronimo-servlet_3.0_spec</artifactId>
- </dependency>
-
- </dependencies>
-</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatchException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatchException.java b/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatchException.java
deleted file mode 100644
index 6bb776c..0000000
--- a/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatchException.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.servlet;
-
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-
-public class DispatchException extends ScimpiException {
- private static final long serialVersionUID = 1L;
-
- public DispatchException() {
- }
-
- public DispatchException(final String message) {
- super(message);
- }
-
- public DispatchException(final Throwable cause) {
- super(cause);
- }
-
- public DispatchException(final String message, final Throwable cause) {
- super(message, cause);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatcherServlet.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatcherServlet.java b/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatcherServlet.java
deleted file mode 100644
index 272e1c4..0000000
--- a/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatcherServlet.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.servlet;
-
-import java.io.IOException;
-import java.util.Enumeration;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.UserManager;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsers;
-
-public class DispatcherServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- private static final Logger LOG = LoggerFactory.getLogger(DispatcherServlet.class);
- private Dispatcher dispatcher;
- private DebugUsers debugUsers;
-
- @Override
- protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
- LOG.info("http request from " + request.getRemoteAddr() + ": post " + request.getServletPath() + "?" + request.getQueryString());
- process(request, response);
- }
-
- @Override
- protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
- LOG.info("http request from " + request.getRemoteAddr() + ": get " + request.getServletPath() + "?" + request.getQueryString());
- process(request, response);
- }
-
- private void process(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
- try {
- final ServletRequestContext context = new ServletRequestContext(debugUsers);
- context.startRequest(request, response, getServletContext());
- dispatcher.process(context, request.getServletPath());
- } catch (final RuntimeException e) {
- LOG.error("servlet exception", e);
- throw e;
- }
- }
-
- @Override
- public void init() throws ServletException {
- super.init();
-
- // TODO get directory from servlet parameter
- ImageLookup.setImageDirectory(getServletContext(), "images");
-
- debugUsers = new DebugUsers();
- debugUsers.initialize();
-
- dispatcher = new Dispatcher();
- final Enumeration initParameterNames = getInitParameterNames();
- while (initParameterNames.hasMoreElements()) {
- final String name = (String) initParameterNames.nextElement();
- final String value = getInitParameter(name);
- dispatcher.addParameter(name, value);
- }
- final String dir = getServletContext().getRealPath("/WEB-INF");
- dispatcher.init(dir, debugUsers);
-
- new UserManager(IsisContext.getAuthenticationManager());
- }
-}
[41/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
ISIS-789: adding example/application/neoapp
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/fa30a76a
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/fa30a76a
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/fa30a76a
Branch: refs/heads/ISIS-789
Commit: fa30a76a79c2cad2d3f3a2e65dc61a3b9a90bbc0
Parents: 859a135
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Mar 30 15:04:20 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Mar 30 15:04:20 2015 +0100
----------------------------------------------------------------------
example/application/neoapp/dom/.gitignore | 2 +
example/application/neoapp/dom/log4j.properties | 41 +
example/application/neoapp/dom/pom.xml | 162 +
.../dom/src/main/java/META-INF/persistence.xml | 26 +
.../dom/src/main/java/dom/simple/ARecord.java | 70 +
.../dom/src/main/java/dom/simple/Host.java | 61 +
.../dom/src/main/java/dom/simple/Hosts.java | 29 +
.../dom/src/main/java/dom/simple/IpAddress.java | 54 +
.../src/main/java/dom/simple/SimpleObject.java | 101 +
.../java/dom/simple/SimpleObject.layout.json | 44 +
.../src/main/java/dom/simple/SimpleObject.png | Bin 0 -> 557 bytes
.../src/main/java/dom/simple/SimpleObjects.java | 63 +
.../test/java/dom/simple/SimpleObjectTest.java | 51 +
.../test/java/dom/simple/SimpleObjectsTest.java | 102 +
example/application/neoapp/fixture/.gitignore | 2 +
example/application/neoapp/fixture/pom.xml | 38 +
.../simple/SimpleObjectsFixturesService.java | 69 +
.../simple/SimpleObjectsTearDownFixture.java | 36 +
.../simple/objects/SimpleObjectAbstract.java | 36 +
.../simple/objects/SimpleObjectForBar.java | 31 +
.../simple/objects/SimpleObjectForBaz.java | 31 +
.../simple/objects/SimpleObjectForFoo.java | 31 +
.../simple/scenario/SimpleObjectsFixture.java | 45 +
.../application/neoapp/integtests/.gitignore | 3 +
.../neoapp/integtests/logging.properties | 103 +
example/application/neoapp/integtests/pom.xml | 122 +
.../integration/SimpleAppSystemInitializer.java | 72 +
.../integration/glue/BootstrappingGlue.java | 53 +
.../integration/glue/CatalogOfFixturesGlue.java | 46 +
.../glue/InMemoryDBForSimpleApp.java | 40 +
.../glue/simple/SimpleObjectGlue.java | 96 +
.../java/integration/specs/simple/RunSpecs.java | 38 +
.../SimpleObjectSpec_listAllAndCreate.feature | 37 +
.../integration/tests/SimpleAppIntegTest.java | 38 +
.../tests/smoke/SimpleObjectTest.java | 82 +
.../tests/smoke/SimpleObjectsTest.java | 148 +
example/application/neoapp/pom.xml | 373 ++
example/application/neoapp/webapp/.gitignore | 4 +
.../launch/SimpleApp-PROTOTYPE-jrebel.launch | 30 +
.../SimpleApp-PROTOTYPE-no-fixtures.launch | 22 +
.../SimpleApp-PROTOTYPE-with-fixtures.launch | 19 +
.../launch/SimpleApp-SERVER-no-fixtures.launch | 47 +
.../webapp/ide/intellij/launch/README.txt | 2 +
.../ide/intellij/launch/SimpleApp_PROTOTYPE.xml | 28 +
.../launch/SimpleApp__enhance_only_.xml | 22 +
.../application/neoapp/webapp/lib/.gitignore | 5 +
example/application/neoapp/webapp/pom.xml | 350 ++
.../src/main/java/webapp/SimpleApplication.java | 149 +
.../src/main/jettyconsole/isis-banner.pdn | Bin 0 -> 69658 bytes
.../src/main/jettyconsole/isis-banner.png | Bin 0 -> 30776 bytes
.../src/main/resources/webapp/welcome.html | 35 +
.../src/main/webapp/WEB-INF/isis.properties | 233 +
.../src/main/webapp/WEB-INF/logging.properties | 185 +
.../main/webapp/WEB-INF/persistor.properties | 124 +
.../WEB-INF/persistor_datanucleus.properties | 104 +
.../webapp/src/main/webapp/WEB-INF/shiro.ini | 93 +
.../WEB-INF/viewer_restfulobjects.properties | 66 +
.../webapp/WEB-INF/viewer_wicket.properties | 84 +
.../webapp/src/main/webapp/WEB-INF/web.xml | 309 +
.../src/main/webapp/about/images/isis-logo.png | Bin 0 -> 14160 bytes
.../webapp/src/main/webapp/about/index.html | 114 +
.../webapp/src/main/webapp/css/application.css | 19 +
.../webapp/src/main/webapp/cy2neo/bower.json | 31 +
.../webapp/src/main/webapp/cy2neo/index.html | 135 +
.../main/webapp/cy2neo/scripts/alchemyConfig.js | 33 +
.../webapp/cy2neo/scripts/codemirror-cypher.js | 190 +
.../main/webapp/cy2neo/scripts/codemirror.js | 5909 ++++++++++++++++++
.../src/main/webapp/cy2neo/scripts/cy2neo.js | 4 +
.../src/main/webapp/cy2neo/scripts/data.js | 766 +++
.../src/main/webapp/cy2neo/scripts/neo.js | 73 +
.../src/main/webapp/cy2neo/scripts/vendor.js | 10 +
.../webapp/cy2neo/styles/codemirror-neo.css | 25 +
.../main/webapp/cy2neo/styles/codemirror.css | 263 +
.../src/main/webapp/cy2neo/styles/cy2neo.css | 21 +
.../webapp/cy2neo/styles/fonts/FontAwesome.otf | Bin 0 -> 75188 bytes
.../cy2neo/styles/fonts/fontawesome-webfont.eot | Bin 0 -> 72449 bytes
.../cy2neo/styles/fonts/fontawesome-webfont.svg | 504 ++
.../cy2neo/styles/fonts/fontawesome-webfont.ttf | Bin 0 -> 141564 bytes
.../styles/fonts/fontawesome-webfont.woff | Bin 0 -> 83760 bytes
.../webapp/cy2neo/styles/gh-fork-ribbon.css | 140 +
.../webapp/cy2neo/styles/images/maze-black.png | Bin 0 -> 667 bytes
.../src/main/webapp/images/spinning-icon.gif | Bin 0 -> 5266 bytes
.../webapp/scripts/alchemy/alchemy-white.css | 698 +++
.../src/main/webapp/scripts/alchemy/alchemy.css | 714 +++
.../src/main/webapp/scripts/alchemy/alchemy.js | 3153 ++++++++++
.../main/webapp/scripts/alchemy/alchemy.min.css | 1 +
.../main/webapp/scripts/alchemy/alchemy.min.js | 3 +
.../webapp/scripts/alchemy/scripts/vendor.js | 10 +
.../alchemy/styles/fonts/FontAwesome.otf | Bin 0 -> 75188 bytes
.../styles/fonts/fontawesome-webfont.eot | Bin 0 -> 72449 bytes
.../styles/fonts/fontawesome-webfont.svg | 504 ++
.../styles/fonts/fontawesome-webfont.ttf | Bin 0 -> 141564 bytes
.../styles/fonts/fontawesome-webfont.woff | Bin 0 -> 83760 bytes
.../alchemy/styles/images/maze-black.png | Bin 0 -> 667 bytes
.../webapp/scripts/alchemy/styles/vendor.css | 8 +
.../src/main/webapp/scripts/application.js | 3 +
.../webapp/src/test/resources/NeoBrowser.PNG | Bin 0 -> 39360 bytes
97 files changed, 17618 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/.gitignore b/example/application/neoapp/dom/.gitignore
new file mode 100644
index 0000000..76414b3
--- /dev/null
+++ b/example/application/neoapp/dom/.gitignore
@@ -0,0 +1,2 @@
+target
+target-ide
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/log4j.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/log4j.properties b/example/application/neoapp/dom/log4j.properties
new file mode 100644
index 0000000..ca165ac
--- /dev/null
+++ b/example/application/neoapp/dom/log4j.properties
@@ -0,0 +1,41 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# LOG4J Configuration
+# ===================
+
+# Basic logging goes to "datanucleus.log"
+log4j.appender.A1=org.apache.log4j.FileAppender
+log4j.appender.A1.File=datanucleus.log
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} (%t) %-5p [%c] - %m%n
+#log4j.appender.A1.Threshold=INFO
+
+# Categories
+# Each category can be set to a "level", and to direct to an appender
+
+# Default to DEBUG level for all DataNucleus categories
+log4j.logger.DataNucleus = DEBUG, A1
+
+log4j.category.com.mchange.v2.c3p0=INFO, A1
+log4j.category.com.mchange.v2.resourcepool=INFO, A1
+log4j.category.org.logicalcobwebs.proxool=INFO,A1
+
+
+# Hbase libs logging
+log4j.category.org.apache.hadoop=INFO,A1
+log4j.category.org.apache.zookeeper=INFO,A1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/pom.xml b/example/application/neoapp/dom/pom.xml
new file mode 100644
index 0000000..e1d22e9
--- /dev/null
+++ b/example/application/neoapp/dom/pom.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+--><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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.isis.example.application</groupId>
+ <artifactId>neoapp</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>neoapp-dom</artifactId>
+ <name>Neo App DOM</name>
+
+ <build>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ </resource>
+ <resource>
+ <directory>src/main/java</directory>
+ <includes>
+ <include>**</include>
+ </includes>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.datanucleus</groupId>
+ <artifactId>datanucleus-maven-plugin</artifactId>
+ <version>${datanucleus-maven-plugin.version}</version>
+ <configuration>
+ <fork>false</fork>
+ <log4jConfiguration>${basedir}/log4j.properties</log4jConfiguration>
+ <verbose>true</verbose>
+ <props>${basedir}/datanucleus.properties</props>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>enhance</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <pluginManagement>
+ <plugins>
+ <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+ <plugin>
+ <groupId>org.eclipse.m2e</groupId>
+ <artifactId>lifecycle-mapping</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <lifecycleMappingMetadata>
+ <pluginExecutions>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>org.datanucleus</groupId>
+ <artifactId>datanucleus-maven-plugin</artifactId>
+ <versionRange>[4.0.0-release,)</versionRange>
+ <goals>
+ <goal>enhance</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ </pluginExecutions>
+ </lifecycleMappingMetadata>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-applib</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-unittestsupport</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- Bytecode libraries (for mocking) -->
+ <dependency>
+ <groupId>org.objenesis</groupId>
+ <artifactId>objenesis</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <id>isis-validate</id>
+ <activation>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.isis.tool</groupId>
+ <artifactId>isis-maven-plugin</artifactId>
+ <version>1.8.0-SNAPSHOT</version>
+ <configuration>
+ <isisConfigDir>../webapp/src/main/webapp/WEB-INF</isisConfigDir>
+ </configuration>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.isis.example.application</groupId>
+ <artifactId>todoapp-dom</artifactId>
+ <version>1.8.0-SNAPSHOT</version>
+ </dependency>
+ <!--
+ ... workaround to avoid conflict with plexus-default
+ (not sure why exclusions in the isis-maven-plugin aren't sufficient, though ...
+ -->
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>16.0.1</version>
+ </dependency>
+ </dependencies>
+ <executions>
+ <execution>
+ <phase>test</phase>
+ <goals>
+ <goal>validate</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml b/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml
new file mode 100644
index 0000000..8824aa1
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
+
+ <persistence-unit name="simple">
+ </persistence-unit>
+</persistence>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/main/java/dom/simple/ARecord.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/ARecord.java b/example/application/neoapp/dom/src/main/java/dom/simple/ARecord.java
new file mode 100644
index 0000000..fa3846c
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/ARecord.java
@@ -0,0 +1,70 @@
+package dom.simple;
+
+
+import javax.inject.Inject;
+import javax.jdo.annotations.*;
+
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ObjectType;
+import org.apache.isis.applib.annotation.Title;
+import org.apache.isis.applib.util.ObjectContracts;
+
+@PersistenceCapable(identityType=IdentityType.DATASTORE)
+@DatastoreIdentity(
+ strategy= IdGeneratorStrategy.IDENTITY,
+ column="id")
+@Version(
+ strategy=VersionStrategy.VERSION_NUMBER,
+ column="version")
+@Unique(name="A_RECORD_NAME_UNQ", members = {"name"})
+@ObjectType("A_RECORD")
+@Bookmarkable
+public class ARecord implements Comparable<ARecord> {
+
+ //region > name (property)
+ private String name;
+
+ @Column(allowsNull="false")
+ @Title(sequence="1")
+ @MemberOrder(sequence="1")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+ //endregion
+
+ // region > IpAddress property
+ private IpAddress ipAddress;
+
+ @Column(allowsNull="false")
+ @Title(sequence="2")
+ @MemberOrder(sequence="2")
+ public IpAddress getIpAddress() {
+ return ipAddress;
+ }
+
+ public void setIpAddress(final IpAddress ipAddress) {
+ this.ipAddress = ipAddress;
+ }
+ //endregion
+
+
+ //region > compareTo
+ @Override
+ public int compareTo(ARecord other) {
+ return ObjectContracts.compare(this, other, "name");
+ }
+ //endregion
+
+ //region > injected services
+ @Inject
+ @SuppressWarnings("unused")
+ private DomainObjectContainer container;
+ //endregion
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/main/java/dom/simple/Host.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/Host.java b/example/application/neoapp/dom/src/main/java/dom/simple/Host.java
new file mode 100644
index 0000000..d206f64
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/Host.java
@@ -0,0 +1,61 @@
+package dom.simple;
+
+import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ObjectType;
+import org.apache.isis.applib.annotation.Title;
+
+import javax.jdo.annotations.*;
+import java.util.List;
+
+@PersistenceCapable(identityType= IdentityType.DATASTORE)
+@DatastoreIdentity(
+ strategy= IdGeneratorStrategy.IDENTITY,
+ column="id")
+@Version(
+ strategy=VersionStrategy.VERSION_NUMBER,
+ column="version")
+@Unique(name="HOST_NAME_UNQ", members = {"name"})
+@ObjectType("HOST")
+@Bookmarkable
+public class Host {
+
+ // region > Name property
+ private String name;
+
+ @Column(allowsNull="false")
+ @Title(sequence="1")
+ @MemberOrder(sequence="1")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+ //endregion
+
+ // region > IpAddresses property
+ private List<IpAddress> ipAddresses;
+
+ @Column(allowsNull="false")
+ @Title(sequence="2")
+ @MemberOrder(sequence="2")
+ public List<IpAddress> getIpAddresses() {
+ return ipAddresses;
+ }
+
+ public void setIpAddresses(final List<IpAddress> ipAddresses) {
+ this.ipAddresses = ipAddresses;
+ }
+ //endregion
+
+ public void addIpAddress(IpAddress ipAddress){
+ this.ipAddresses.add(ipAddress);
+ }
+
+ public void removeIpAddress(IpAddress ipAddress){
+ this.ipAddresses.remove(ipAddress);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/main/java/dom/simple/Hosts.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/Hosts.java b/example/application/neoapp/dom/src/main/java/dom/simple/Hosts.java
new file mode 100644
index 0000000..b4124f0
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/Hosts.java
@@ -0,0 +1,29 @@
+package dom.simple;
+
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ParameterLayout;
+
+@DomainService(menuOrder = "10", repositoryFor = Host.class)
+public class Hosts {
+
+ //region > create (action)
+ @MemberOrder(sequence = "2")
+ public Host create(
+ final @ParameterLayout(named="Name") String name) {
+ final Host obj = container.newTransientInstance(Host.class);
+ obj.setName(name);
+ container.persistIfNotAlready(obj);
+ return obj;
+ }
+
+ //endregion
+
+ //region > injected services
+
+ @javax.inject.Inject
+ DomainObjectContainer container;
+
+ //endregion
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/main/java/dom/simple/IpAddress.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/IpAddress.java b/example/application/neoapp/dom/src/main/java/dom/simple/IpAddress.java
new file mode 100644
index 0000000..27c381c
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/IpAddress.java
@@ -0,0 +1,54 @@
+package dom.simple;
+
+import javax.inject.Inject;
+import javax.jdo.annotations.*;
+
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ObjectType;
+import org.apache.isis.applib.annotation.Title;
+import org.apache.isis.applib.util.ObjectContracts;
+
+@PersistenceCapable(identityType=IdentityType.DATASTORE)
+@DatastoreIdentity(
+ strategy= IdGeneratorStrategy.IDENTITY,
+ column="id")
+@Version(
+ strategy=VersionStrategy.VERSION_NUMBER,
+ column="version")
+@Unique(name="IP_ADDRESS_ADDRESS_UNQ", members = {"address"})
+@ObjectType("IP_ADDRESS")
+@Bookmarkable
+public class IpAddress implements Comparable<IpAddress> {
+
+ // region > Address property
+ private String address;
+
+ @Column(allowsNull="false")
+ @Title(sequence="1")
+ @MemberOrder(sequence="1")
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(final String address) {
+ this.address = address;
+ }
+ //endregion
+
+
+ //region > compareTo
+ @Override
+ public int compareTo(IpAddress other) {
+ return ObjectContracts.compare(this, other, "address");
+ }
+ //endregion
+
+ //region > injected services
+ @Inject
+ @SuppressWarnings("unused")
+ private DomainObjectContainer container;
+ //endregion
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java
new file mode 100644
index 0000000..f43f038
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package dom.simple;
+
+import javax.jdo.annotations.IdentityType;
+import javax.jdo.annotations.VersionStrategy;
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ObjectType;
+import org.apache.isis.applib.annotation.Title;
+import org.apache.isis.applib.util.ObjectContracts;
+
+@javax.jdo.annotations.PersistenceCapable(identityType=IdentityType.DATASTORE)
+@javax.jdo.annotations.DatastoreIdentity(
+ strategy=javax.jdo.annotations.IdGeneratorStrategy.IDENTITY,
+ column="id")
+@javax.jdo.annotations.Version(
+ strategy=VersionStrategy.VERSION_NUMBER,
+ column="version")
+@javax.jdo.annotations.Unique(name="SimpleObject_name_UNQ", members = {"name"})
+@ObjectType("SIMPLE")
+@Bookmarkable
+public class SimpleObject implements Comparable<SimpleObject> {
+
+ //region > name (property)
+
+ private String name;
+
+ @javax.jdo.annotations.Column(allowsNull="false")
+ @Title(sequence="1")
+ @MemberOrder(sequence="1")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ //endregion
+
+ //region > label (property)
+
+ private Label label;
+
+ @javax.jdo.annotations.Column(allowsNull="false")
+ @Title(sequence="2")
+ @MemberOrder(sequence="2")
+ public Label getLabel() {
+ return label;
+ }
+
+ public void setLabel(final Label label) {
+ this.label = label;
+ }
+
+ //endregion
+
+
+
+ //region > compareTo
+
+ @Override
+ public int compareTo(SimpleObject other) {
+ return ObjectContracts.compare(this, other, "name");
+ }
+
+ //endregion
+
+ //region > injected services
+
+ @javax.inject.Inject
+ @SuppressWarnings("unused")
+ private DomainObjectContainer container;
+
+ //endregion
+
+ enum Label {
+ NodeType1,
+ NodeType2,
+ AnotherNodeType
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json
new file mode 100644
index 0000000..35f57bb
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{
+ "columns": [
+ {
+ "span": 6,
+ "memberGroups": {
+ "General": {
+ "members": {
+ "name": {}
+ }
+ }
+ }
+ },
+ {
+ "span": 0,
+ "memberGroups": {}
+ },
+ {
+ "span": 0,
+ "memberGroups": {}
+ },
+ {
+ "span": 6,
+ "collections": {}
+ }
+ ],
+ "actions": {}
+}
+
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png
new file mode 100644
index 0000000..3f91282
Binary files /dev/null and b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java
new file mode 100644
index 0000000..5540293
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package dom.simple;
+
+import java.util.List;
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.ActionSemantics.Of;
+import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ParameterLayout;
+
+@DomainService(menuOrder = "10", repositoryFor = SimpleObject.class)
+public class SimpleObjects {
+
+ //region > listAll (action)
+
+ @Bookmarkable
+ @ActionSemantics(Of.SAFE)
+ @MemberOrder(sequence = "1")
+ public List<SimpleObject> listAll() {
+ return container.allInstances(SimpleObject.class);
+ }
+
+ //endregion
+
+ //region > create (action)
+ @MemberOrder(sequence = "2")
+ public SimpleObject create(
+ final @ParameterLayout(named="Name") String name) {
+ final SimpleObject obj = container.newTransientInstance(SimpleObject.class);
+ obj.setName(name);
+ container.persistIfNotAlready(obj);
+ return obj;
+ }
+
+ //endregion
+
+ //region > injected services
+
+ @javax.inject.Inject
+ DomainObjectContainer container;
+
+ //endregion
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java
new file mode 100644
index 0000000..fe6f0ac
--- /dev/null
+++ b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package dom.simple;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectTest {
+
+ SimpleObject simpleObject;
+
+ @Before
+ public void setUp() throws Exception {
+ simpleObject = new SimpleObject();
+ }
+
+ public static class Name extends SimpleObjectTest {
+
+ @Test
+ public void happyCase() throws Exception {
+ // given
+ String name = "Foobar";
+ assertThat(simpleObject.getName(), is(nullValue()));
+
+ // when
+ simpleObject.setName(name);
+
+ // then
+ assertThat(simpleObject.getName(), is(name));
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java
new file mode 100644
index 0000000..27b9ac3
--- /dev/null
+++ b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java
@@ -0,0 +1,102 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package dom.simple;
+
+import java.util.List;
+import com.google.common.collect.Lists;
+import org.jmock.Expectations;
+import org.jmock.Sequence;
+import org.jmock.auto.Mock;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectsTest {
+
+ @Rule
+ public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+
+ @Mock
+ DomainObjectContainer mockContainer;
+
+ SimpleObjects simpleObjects;
+
+ @Before
+ public void setUp() throws Exception {
+ simpleObjects = new SimpleObjects();
+ simpleObjects.container = mockContainer;
+ }
+
+ public static class Create extends SimpleObjectsTest {
+
+ @Test
+ public void happyCase() throws Exception {
+
+ // given
+ final SimpleObject simpleObject = new SimpleObject();
+
+ final Sequence seq = context.sequence("create");
+ context.checking(new Expectations() {
+ {
+ oneOf(mockContainer).newTransientInstance(SimpleObject.class);
+ inSequence(seq);
+ will(returnValue(simpleObject));
+
+ oneOf(mockContainer).persistIfNotAlready(simpleObject);
+ inSequence(seq);
+ }
+ });
+
+ // when
+ final SimpleObject obj = simpleObjects.create("Foobar");
+
+ // then
+ assertThat(obj, is(simpleObject));
+ assertThat(obj.getName(), is("Foobar"));
+ }
+
+ }
+
+ public static class ListAll extends SimpleObjectsTest {
+
+ @Test
+ public void happyCase() throws Exception {
+
+ // given
+ final List<SimpleObject> all = Lists.newArrayList();
+
+ context.checking(new Expectations() {
+ {
+ oneOf(mockContainer).allInstances(SimpleObject.class);
+ will(returnValue(all));
+ }
+ });
+
+ // when
+ final List<SimpleObject> list = simpleObjects.listAll();
+
+ // then
+ assertThat(list, is(all));
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/fixture/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/.gitignore b/example/application/neoapp/fixture/.gitignore
new file mode 100644
index 0000000..128ef84
--- /dev/null
+++ b/example/application/neoapp/fixture/.gitignore
@@ -0,0 +1,2 @@
+/target-ide
+target
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/fixture/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/pom.xml b/example/application/neoapp/fixture/pom.xml
new file mode 100644
index 0000000..8291deb
--- /dev/null
+++ b/example/application/neoapp/fixture/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+--><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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.isis.example.application</groupId>
+ <artifactId>neoapp</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>neoapp-fixture</artifactId>
+ <name>Neo App Fixtures</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>neoapp-dom</artifactId>
+ </dependency>
+ </dependencies>
+
+</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
new file mode 100644
index 0000000..690b7b6
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package fixture.simple;
+
+import fixture.simple.scenario.SimpleObjectsFixture;
+
+import java.util.List;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Prototype;
+import org.apache.isis.applib.fixturescripts.FixtureResult;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
+import org.apache.isis.applib.fixturescripts.SimpleFixtureScript;
+
+/**
+ * Enables fixtures to be installed from the application.
+ */
+@DomainService
+@DomainServiceLayout(named="Prototyping", menuBar = DomainServiceLayout.MenuBar.SECONDARY, menuOrder = "20")
+public class SimpleObjectsFixturesService extends FixtureScripts {
+
+ public SimpleObjectsFixturesService() {
+ super("fixture.simple");
+ }
+
+ @Override
+ public FixtureScript default0RunFixtureScript() {
+ return findFixtureScriptFor(SimpleFixtureScript.class);
+ }
+
+ /**
+ * Raising visibility to <tt>public</tt> so that choices are available for first param
+ * of {@link #runFixtureScript(FixtureScript, String)}.
+ */
+ @Override
+ public List<FixtureScript> choices0RunFixtureScript() {
+ return super.choices0RunFixtureScript();
+ }
+
+
+ // //////////////////////////////////////
+
+ @Prototype
+ @MemberOrder(sequence="20")
+ public Object installFixturesAndReturnFirst() {
+ final List<FixtureResult> run = findFixtureScriptFor(SimpleObjectsFixture.class).run(null);
+ return run.get(0).getObject();
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java
new file mode 100644
index 0000000..2f9be56
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package fixture.simple;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.objectstore.jdo.applib.service.support.IsisJdoSupport;
+
+public class SimpleObjectsTearDownFixture extends FixtureScript {
+
+ @Override
+ protected void execute(ExecutionContext executionContext) {
+ isisJdoSupport.executeUpdate("delete from \"SimpleObject\"");
+ }
+
+
+ @javax.inject.Inject
+ private IsisJdoSupport isisJdoSupport;
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
new file mode 100644
index 0000000..0edd80b
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package fixture.simple.objects;
+
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+public abstract class SimpleObjectAbstract extends FixtureScript {
+
+ protected SimpleObject create(final String name, ExecutionContext executionContext) {
+ return executionContext.addResult(this, simpleObjects.create(name));
+ }
+
+ @javax.inject.Inject
+ private SimpleObjects simpleObjects;
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
new file mode 100644
index 0000000..a59aea4
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package fixture.simple.objects;
+
+public class SimpleObjectForBar extends SimpleObjectAbstract {
+
+ @Override
+ protected void execute(ExecutionContext executionContext) {
+
+ create("Bar", executionContext);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
new file mode 100644
index 0000000..b71baeb
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package fixture.simple.objects;
+
+public class SimpleObjectForBaz extends SimpleObjectAbstract {
+
+ @Override
+ protected void execute(ExecutionContext executionContext) {
+
+ create("Baz", executionContext);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
new file mode 100644
index 0000000..fa3d488
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package fixture.simple.objects;
+
+public class SimpleObjectForFoo extends SimpleObjectAbstract {
+
+ @Override
+ protected void execute(ExecutionContext executionContext) {
+
+ create("Foo", executionContext);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
new file mode 100644
index 0000000..c44af4b
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package fixture.simple.scenario;
+
+import fixture.simple.SimpleObjectsTearDownFixture;
+import fixture.simple.objects.SimpleObjectForBar;
+import fixture.simple.objects.SimpleObjectForBaz;
+import fixture.simple.objects.SimpleObjectForFoo;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+public class SimpleObjectsFixture extends FixtureScript {
+
+ public SimpleObjectsFixture() {
+ withDiscoverability(Discoverability.DISCOVERABLE);
+ }
+
+ @Override
+ protected void execute(ExecutionContext executionContext) {
+
+ executionContext.executeChild(this, new SimpleObjectsTearDownFixture());
+
+ executionContext.executeChild(this, new SimpleObjectForFoo());
+ executionContext.executeChild(this, new SimpleObjectForBar());
+ executionContext.executeChild(this, new SimpleObjectForBaz());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/.gitignore b/example/application/neoapp/integtests/.gitignore
new file mode 100644
index 0000000..3faa3ab
--- /dev/null
+++ b/example/application/neoapp/integtests/.gitignore
@@ -0,0 +1,3 @@
+/neo4j_DB/
+target
+target-ide
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/logging.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/logging.properties b/example/application/neoapp/integtests/logging.properties
new file mode 100644
index 0000000..d0b81cb
--- /dev/null
+++ b/example/application/neoapp/integtests/logging.properties
@@ -0,0 +1,103 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+
+#
+# Isis uses log4j is used to provide system logging
+#
+log4j.rootCategory=INFO, Console
+
+# The console appender
+log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.target=System.out
+log4j.appender.Console.layout=org.apache.log4j.PatternLayout
+log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n
+
+log4j.appender.File=org.apache.log4j.RollingFileAppender
+log4j.appender.File.file=isis.log
+log4j.appender.File.append=false
+log4j.appender.File.layout=org.apache.log4j.PatternLayout
+log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p] %m%n
+
+
+! turn on the internal log4j debugging flag so we can see what it is doing
+#log4j.debug=true
+
+
+# DataNucleus
+# the first two log the DML and DDL (if set to DEBUG)
+log4j.logger.DataNucleus.Datastore.Native=WARN, Console
+log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console
+# the remainder can probably be left to WARN
+log4j.logger.DataNucleus.Persistence=WARN, Console
+log4j.logger.DataNucleus.Transaction=WARN, Console
+log4j.logger.DataNucleus.Connection=WARN, Console
+log4j.logger.DataNucleus.Query=WARN, Console
+log4j.logger.DataNucleus.Cache=WARN, Console
+log4j.logger.DataNucleus.MetaData=WARN, Console
+log4j.logger.DataNucleus.Datastore=WARN, Console
+log4j.logger.DataNucleus.Datastore.Persist=WARN, Console
+log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console
+log4j.logger.DataNucleus.General=WARN, Console
+log4j.logger.DataNucleus.Lifecycle=WARN, Console
+log4j.logger.DataNucleus.ValueGeneration=WARN, Console
+log4j.logger.DataNucleus.Enhancer=WARN, Console
+log4j.logger.DataNucleus.SchemaTool=ERROR, Console
+log4j.logger.DataNucleus.JDO=WARN, Console
+log4j.logger.DataNucleus.JPA=ERROR, Console
+log4j.logger.DataNucleus.JCA=WARN, Console
+log4j.logger.DataNucleus.IDE=ERROR, Console
+
+log4j.additivity.DataNucleus.Datastore.Native=false
+log4j.additivity.DataNucleus.Datastore.Schema=false
+log4j.additivity.DataNucleus.Datastore.Persistence=false
+log4j.additivity.DataNucleus.Datastore.Transaction=false
+log4j.additivity.DataNucleus.Datastore.Connection=false
+log4j.additivity.DataNucleus.Datastore.Query=false
+log4j.additivity.DataNucleus.Datastore.Cache=false
+log4j.additivity.DataNucleus.Datastore.MetaData=false
+log4j.additivity.DataNucleus.Datastore.Datastore=false
+log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false
+log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false
+log4j.additivity.DataNucleus.Datastore.General=false
+log4j.additivity.DataNucleus.Datastore.Lifecycle=false
+log4j.additivity.DataNucleus.Datastore.ValueGeneration=false
+log4j.additivity.DataNucleus.Datastore.Enhancer=false
+log4j.additivity.DataNucleus.Datastore.SchemaTool=false
+log4j.additivity.DataNucleus.Datastore.JDO=false
+log4j.additivity.DataNucleus.Datastore.JPA=false
+log4j.additivity.DataNucleus.Datastore.JCA=false
+log4j.additivity.DataNucleus.Datastore.IDE=false
+
+
+
+
+# if using log4jdbc-remix as JDBC driver
+#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console
+#log4j.additivity.jdbc.sqlonly=false
+#log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console
+#log4j.additivity.jdbc.resultsettable=false
+
+#log4j.logger.jdbc.audit=WARN,jdbc, Console
+#log4j.additivity.jdbc.audit=false
+#log4j.logger.jdbc.resultset=WARN,jdbc
+#log4j.additivity.jdbc.resultset=false
+#log4j.logger.jdbc.sqltiming=WARN,sqltiming
+#log4j.additivity.jdbc.sqltiming=false
+#log4j.logger.jdbc.connection=FATAL,connection
+#log4j.additivity.jdbc.connection=false
+
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/pom.xml b/example/application/neoapp/integtests/pom.xml
new file mode 100644
index 0000000..da29c47
--- /dev/null
+++ b/example/application/neoapp/integtests/pom.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+--><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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.isis.example.application</groupId>
+ <artifactId>neoapp</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>neoapp-integtests</artifactId>
+ <name>Neo App Integration Tests</name>
+
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/java</directory>
+ <includes>
+ <include>**</include>
+ </includes>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </testResource>
+ </testResources>
+ </build>
+ <dependencies>
+
+ <!-- other modules in this project -->
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>neoapp-fixture</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-unittestsupport</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-integtestsupport</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-specsupport</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-library</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-wrapper</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-runtime</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hsqldb</groupId>
+ <artifactId>hsqldb</artifactId>
+ </dependency>
+
+ <!--
+ uncomment to enable enhanced cucumber-jvm reporting
+ http://www.masterthought.net/section/cucumber-reporting
+ <dependency>
+ <groupId>com.googlecode.totallylazy</groupId>
+ <artifactId>totallylazy</artifactId>
+ <version>991</version>
+ </dependency>
+
+ <dependency>
+ <groupId>net.masterthought</groupId>
+ <artifactId>cucumber-reporting</artifactId>
+ <version>0.0.21</version>
+ </dependency>
+ <dependency>
+ <groupId>net.masterthought</groupId>
+ <artifactId>maven-cucumber-reporting</artifactId>
+ <version>0.0.4</version>
+ </dependency>
+ -->
+ </dependencies>
+
+ <!--
+ uncomment for enhanced cucumber-jvm reporting
+ http://www.masterthought.net/section/cucumber-reporting
+ <repositories>
+ <repository>
+ <id>repo.bodar.com</id>
+ <url>http://repo.bodar.com</url>
+ </repository>
+ </repositories>
+ -->
+
+
+</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java b/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java
new file mode 100644
index 0000000..fa67f2a
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java
@@ -0,0 +1,72 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package integration;
+
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.integtestsupport.IsisSystemForTest;
+import org.apache.isis.core.runtime.persistence.PersistenceConstants;
+import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPersistenceMechanismInstaller;
+import org.apache.isis.objectstore.jdo.datanucleus.IsisConfigurationForJdoIntegTests;
+
+/**
+ * Holds an instance of an {@link IsisSystemForTest} as a {@link ThreadLocal} on the current thread,
+ * initialized with ToDo app's domain services.
+ */
+public class SimpleAppSystemInitializer {
+
+ private SimpleAppSystemInitializer(){}
+
+ public static IsisSystemForTest initIsft() {
+ IsisSystemForTest isft = IsisSystemForTest.getElseNull();
+ if(isft == null) {
+ isft = new SimpleAppSystemBuilder().build().setUpSystem();
+ IsisSystemForTest.set(isft);
+ }
+ return isft;
+ }
+
+ private static class SimpleAppSystemBuilder extends IsisSystemForTest.Builder {
+
+ public SimpleAppSystemBuilder() {
+ withLoggingAt(org.apache.log4j.Level.INFO);
+ with(testConfiguration());
+ with(new DataNucleusPersistenceMechanismInstaller());
+
+ // services annotated with @DomainService
+ withServicesIn( "dom.simple"
+ ,"fixture.simple"
+ ,"org.apache.isis.core.wrapper"
+ ,"org.apache.isis.applib"
+ ,"org.apache.isis.core.metamodel.services"
+ ,"org.apache.isis.core.runtime.services"
+ ,"org.apache.isis.objectstore.jdo.datanucleus.service.support" // IsisJdoSupportImpl
+ ,"org.apache.isis.objectstore.jdo.datanucleus.service.eventbus" // EventBusServiceJdo
+ );
+ }
+
+ private static IsisConfiguration testConfiguration() {
+ final IsisConfigurationForJdoIntegTests testConfiguration = new IsisConfigurationForJdoIntegTests();
+
+ // enable stricter checking
+ testConfiguration.put(PersistenceConstants.ENFORCE_SAFE_SEMANTICS, "true");
+
+ testConfiguration.addRegisterEntitiesPackagePrefix("dom");
+ return testConfiguration;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java b/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java
new file mode 100644
index 0000000..1950881
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java
@@ -0,0 +1,53 @@
+/**
+O * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package integration.glue;
+
+import cucumber.api.java.After;
+import cucumber.api.java.Before;
+import integration.SimpleAppSystemInitializer;
+
+import org.apache.isis.core.specsupport.scenarios.ScenarioExecutionScope;
+import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
+
+public class BootstrappingGlue extends CukeGlueAbstract {
+
+ // //////////////////////////////////////
+
+ @Before(value={"@unit"}, order=100)
+ public void beforeScenarioUnitScope() {
+ before(ScenarioExecutionScope.UNIT);
+ }
+
+ @Before(value={"@integration"}, order=100)
+ public void beforeScenarioIntegrationScope() {
+ org.apache.log4j.PropertyConfigurator.configure("logging.properties");
+ SimpleAppSystemInitializer.initIsft();
+
+ before(ScenarioExecutionScope.INTEGRATION);
+ }
+
+ @After
+ public void afterScenario(cucumber.api.Scenario sc) {
+ assertMocksSatisfied();
+ after(sc);
+ }
+
+ // //////////////////////////////////////
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java b/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
new file mode 100644
index 0000000..508a3a0
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package integration.glue;
+
+import cucumber.api.java.Before;
+import dom.simple.SimpleObject;
+import fixture.simple.scenario.SimpleObjectsFixture;
+
+import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
+import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
+
+public class CatalogOfFixturesGlue extends CukeGlueAbstract {
+
+
+ @Before(value={"@unit", "@SimpleObjectsFixture"}, order=20000)
+ public void unitFixtures() throws Throwable {
+ final InMemoryDB inMemoryDB = new InMemoryDBForSimpleApp(this.scenarioExecution());
+ inMemoryDB.getElseCreate(SimpleObject.class, "Foo");
+ inMemoryDB.getElseCreate(SimpleObject.class, "Bar");
+ inMemoryDB.getElseCreate(SimpleObject.class, "Baz");
+ putVar("isis", "in-memory-db", inMemoryDB);
+ }
+
+ // //////////////////////////////////////
+
+ @Before(value={"@integration", "@SimpleObjectsFixture"}, order=20000)
+ public void integrationFixtures() throws Throwable {
+ scenarioExecution().install(new SimpleObjectsFixture());
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java b/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java
new file mode 100644
index 0000000..50f0a51
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package integration.glue;
+
+import dom.simple.SimpleObject;
+
+import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
+import org.apache.isis.core.specsupport.scenarios.ScenarioExecution;
+
+public class InMemoryDBForSimpleApp extends InMemoryDB {
+
+ public InMemoryDBForSimpleApp(ScenarioExecution scenarioExecution) {
+ super(scenarioExecution);
+ }
+
+ /**
+ * Hook to initialize if possible.
+ */
+ @Override
+ protected void init(Object obj, String str) {
+ if(obj instanceof SimpleObject) {
+ SimpleObject toDoItem = (SimpleObject) obj;
+ toDoItem.setName(str);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java b/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java
new file mode 100644
index 0000000..13831ae
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java
@@ -0,0 +1,96 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package integration.glue.simple;
+
+import cucumber.api.java.en.Given;
+import cucumber.api.java.en.When;
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+
+import java.util.List;
+import java.util.UUID;
+import org.hamcrest.Description;
+import org.jmock.Expectations;
+import org.jmock.api.Action;
+import org.jmock.api.Invocation;
+import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
+import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectGlue extends CukeGlueAbstract {
+
+ @Given("^there are.* (\\d+) simple objects$")
+ public void there_are_N_simple_objects(int n) throws Throwable {
+ if(supportsMocks()) {
+ checking(new Expectations() {
+ {
+ allowing(service(SimpleObjects.class)).listAll();
+ will(returnValue(allSimpleObjects()));
+ }
+ });
+ }
+ try {
+ final List<SimpleObject> findAll = service(SimpleObjects.class).listAll();
+ assertThat(findAll.size(), is(n));
+ putVar("list", "all", findAll);
+
+ } finally {
+ assertMocksSatisfied();
+ }
+ }
+
+ @When("^I create a new simple object$")
+ public void I_create_a_new_simple_object() throws Throwable {
+ if(supportsMocks()) {
+ checking(new Expectations() {
+ {
+ oneOf(service(SimpleObjects.class)).create(with(any(String.class)));
+ will(addToInMemoryDB());
+ }
+ });
+ }
+ service(SimpleObjects.class).create(UUID.randomUUID().toString());
+ }
+
+ private Action addToInMemoryDB() {
+ return new Action() {
+
+ @Override
+ public Object invoke(Invocation invocation) throws Throwable {
+ final InMemoryDB inMemoryDB = getVar("isis", "in-memory-db", InMemoryDB.class);
+ final String name = (String)invocation.getParameter(0);
+ final SimpleObject obj = new SimpleObject();
+ obj.setName(name);
+ inMemoryDB.put(SimpleObject.class, name, obj);
+ return obj;
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("add to database");
+ }
+ };
+ }
+
+ // helper
+ private List<SimpleObject> allSimpleObjects() {
+ final InMemoryDB inMemoryDB = getVar("isis", "in-memory-db", InMemoryDB.class);
+ return inMemoryDB.findAll(SimpleObject.class);
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java
new file mode 100644
index 0000000..b4d0913
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package integration.specs.simple;
+
+import cucumber.api.junit.Cucumber;
+
+import org.junit.runner.RunWith;
+
+
+/**
+ * Runs scenarios in all <tt>.feature</tt> files (this package and any subpackages).
+ */
+@RunWith(Cucumber.class)
+@Cucumber.Options(
+ format = {
+ "html:target/cucumber-html-report"
+ ,"json:target/cucumber.json"
+ },
+ glue={"classpath:integration.glue"},
+ strict = true,
+ tags = { "~@backlog", "~@ignore" })
+public class RunSpecs {
+ // intentionally empty
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature
new file mode 100644
index 0000000..aa7aeb6
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature
@@ -0,0 +1,37 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+@SimpleObjectsFixture
+Feature: List and Create New Simple Objectts
+
+ # the scenario is listed twice here just to demonstrate that it
+ # can be run either at @unit-level scope (using mocks) or
+ # at @integration-level scope (against the running system).
+
+ @unit
+ Scenario: Existing simple objects can be listed and new ones created
+ Given there are initially 3 simple objects
+ When I create a new simple object
+ Then there are 4 simple objects
+
+
+ @integration
+ Scenario: Existing simple objects can be listed and new ones created
+ Given there are initially 3 simple objects
+ When I create a new simple object
+ Then there are 4 simple objects
+
+
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java b/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java
new file mode 100644
index 0000000..634476c
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package integration.tests;
+
+import integration.SimpleAppSystemInitializer;
+
+import org.junit.BeforeClass;
+import org.apache.isis.core.integtestsupport.IntegrationTestAbstract;
+import org.apache.isis.core.integtestsupport.scenarios.ScenarioExecutionForIntegration;
+
+public abstract class SimpleAppIntegTest extends IntegrationTestAbstract {
+
+ @BeforeClass
+ public static void initClass() {
+ org.apache.log4j.PropertyConfigurator.configure("logging.properties");
+ SimpleAppSystemInitializer.initIsft();
+
+ // instantiating will install onto ThreadLocal
+ new ScenarioExecutionForIntegration();
+ }
+
+}
[51/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.svg
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.svg b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.svg
deleted file mode 100644
index a9f8469..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,504 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="fontawesomeregular" horiz-adv-x="1536" >
-<font-face units-per-em="1792" ascent="1536" descent="-256" />
-<missing-glyph horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="	" horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="¨" horiz-adv-x="1792" />
-<glyph unicode="©" horiz-adv-x="1792" />
-<glyph unicode="®" horiz-adv-x="1792" />
-<glyph unicode="´" horiz-adv-x="1792" />
-<glyph unicode="Æ" horiz-adv-x="1792" />
-<glyph unicode="Ø" horiz-adv-x="1792" />
-<glyph unicode=" " horiz-adv-x="768" />
-<glyph unicode=" " horiz-adv-x="1537" />
-<glyph unicode=" " horiz-adv-x="768" />
-<glyph unicode=" " horiz-adv-x="1537" />
-<glyph unicode=" " horiz-adv-x="512" />
-<glyph unicode=" " horiz-adv-x="384" />
-<glyph unicode=" " horiz-adv-x="256" />
-<glyph unicode=" " horiz-adv-x="256" />
-<glyph unicode=" " horiz-adv-x="192" />
-<glyph unicode=" " horiz-adv-x="307" />
-<glyph unicode=" " horiz-adv-x="85" />
-<glyph unicode=" " horiz-adv-x="307" />
-<glyph unicode=" " horiz-adv-x="384" />
-<glyph unicode="™" horiz-adv-x="1792" />
-<glyph unicode="∞" horiz-adv-x="1792" />
-<glyph unicode="≠" horiz-adv-x="1792" />
-<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="" horiz-adv-x="1792" d="M93 1350q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78z" />
-<glyph unicode="" d="M0 -64q0 50 34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5 q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5 t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768zM128 1120q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317 q54 43 100.5 115.5t46.5 131.5v11v13.5t-0.5 13t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z " />
-<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354 q-25 27 -25 48zM221 829l306 -297l-73 -421l378 199l377 -199l-72 421l306 297l-422 62l-189 382l-189 -382z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 131q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5 h-874q-121 0 -194 69.5t-73 189.5zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 -96v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 64v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 320q0 -26 19 -45t45 -19h128 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19 h-128q-26 0 -45 -19t-19 -45v-128zM512 -64q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM512 704q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM1536 64 v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM1536 320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19
-45v-128zM1536 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 128v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM0 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 128v384q0 52 38 90t90 38h512q52 0 90 -38 t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 608v192 q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1792" d="M121 608q0 40 28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68z" />
-<glyph unicode="" horiz-adv-x="1408" d="M110 214q0 40 28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-294 -294l294 -294q28 -28 28 -68t-28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294 q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" d="M0 640q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181 q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298zM640 768v640q0 52 38 90t90 38t90 -38t38 -90v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 -96v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM384 -96v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM768 -96v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576 q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 -96v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1536 -96v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23z" />
-<glyph unicode="" d="M0 531v222q0 12 8 23t19 13l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10 q129 -119 165 -170q7 -8 7 -22q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108 q-44 -23 -91 -38q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5z M512 640q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 1056v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23zM256 76q0 -22 7 -40.5 t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5v948h-896v-948zM384 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM640 224v576q0 14 9 23t23 9h64 q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM896 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23z" />
-<glyph unicode="" horiz-adv-x="1664" d="M26 636.5q1 13.5 11 21.5l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5zM256 64 v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22 v-376z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 544v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
-<glyph unicode="" horiz-adv-x="1920" d="M50 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256 q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73zM809 540q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 96v320q0 40 28 68t68 28h465l135 -136q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 985q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39q17 -41 -14 -70 l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70zM1152 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM418 620q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM416 672q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23z" />
-<glyph unicode="" d="M0 64v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552q25 -61 25 -123v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM197 576h316l95 -192h320l95 192h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8 t-2.5 -8z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 320v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55t-32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56z" />
-<glyph unicode="" d="M0 640q0 156 61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5 t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298z" />
-<glyph unicode="" d="M0 0v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129 q-19 -19 -45 -19t-45 19t-19 45zM18 800v7q65 268 270 434.5t480 166.5q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179 q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 160v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832z M256 288v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 544v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z M256 800v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 288v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z M512 544v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5zM512 800v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -
13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z " />
-<glyph unicode="" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192z" />
-<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110zM320 320v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19 q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 650q0 151 67 291t179 242.5t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32 q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32 q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314z" />
-<glyph unicode="" horiz-adv-x="768" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1152" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5zM1008 228q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5 q140 -59 225 -188.5t85 -282.5t-85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45zM1109 -7q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19 q13 0 26 -5q211 -91 338 -283.5t127 -422.5t-127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 0v640h640v-640h-640zM0 768v640h640v-640h-640zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM256 256v128h128v-128h-128zM256 1024v128h128v-128h-128zM768 0v640h384v-128h128v128h128v-384h-384v128h-128v-384h-128zM768 768v640h640v-640h-640z M896 896h384v384h-384v-384zM1024 0v128h128v-128h-128zM1024 1024v128h128v-128h-128zM1280 0v128h128v-128h-128z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 0v1408h63v-1408h-63zM94 1v1407h32v-1407h-32zM189 1v1407h31v-1407h-31zM346 1v1407h31v-1407h-31zM472 1v1407h62v-1407h-62zM629 1v1407h31v-1407h-31zM692 1v1407h31v-1407h-31zM755 1v1407h31v-1407h-31zM880 1v1407h63v-1407h-63zM1037 1v1407h63v-1407h-63z M1163 1v1407h63v-1407h-63zM1289 1v1407h63v-1407h-63zM1383 1v1407h63v-1407h-63zM1541 1v1407h94v-1407h-94zM1666 1v1407h32v-1407h-32zM1729 0v1408h63v-1408h-63z" />
-<glyph unicode="" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM704 1408h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M10 184q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23 t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57 q38 -15 59 -43q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5zM575 1056 q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
-<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 160v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-224 q-13 0 -22.5 9.5t-9.5 22.5zM384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1408 576q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 128v896q0 106 75 181t181 75h224l51 136q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181zM512 576q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM672 576q0 119 84.5 203.5t203.5 84.5t203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8 t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27 q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14zM555 527q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5 t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12zM533 1292q0 -50 4 -151t4 -152q0 -27 -0.5 -80 t-0.5 -79q0 -46 1 -69q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13zM538.5 165q0.5 -37 4.5 -83.5t12 -66.5q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25 t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5 q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9 t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44zM1414 109.5q9 18.5 42 18.5h80v1024 h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5z" />
-<glyph unicode="" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1 t-103 1t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29 t78 27q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44zM5 -64q0 28 26 49q4 3 36 30t59.5 49 t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5q12 0 42 -19.5t57.5 -41.5t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-5
7.5 -41.5t-42 -19.5q-13 0 -20.5 10.5 t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1536 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h896 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h1280 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 416v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5zM0 800v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192 q-13 0 -22.5 9.5t-9.5 22.5zM384 32v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 416v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 800v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 1184v192q0 13 9.5 22.5t22.5 9.5h1344q13 0
22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5 t-9.5 22.5zM32 704q0 14 9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088 q-13 0 -22.5 9.5t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 416v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23t-9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5z M0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5 t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5q39 -17 39 -59v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5 t-84.5 203.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v192l320 320l160 -160l512 512l416 -416v-448h-1408zM256 960q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" />
-<glyph unicode="" d="M0 -128v416l832 832l416 -416l-832 -832h-416zM128 128h128v-128h107l91 91l-235 235l-91 -91v-107zM298 384q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17zM896 1184l166 165q36 38 90 38q53 0 91 -38l235 -234 q37 -39 37 -91q0 -53 -37 -90l-166 -166z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 896q0 212 150 362t362 150t362 -150t150 -362q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179zM256 896q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73v1088q-148 0 -273 -73t-198 -198t-73 -273z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 512q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275q0 -212 -150 -362t-362 -150t-362 150t-150 362zM256 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29v-190 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM640 256v288l672 672l288 -288l-672 -672h-288zM736 448h96v-96h56l116 116l-152 152l-116 -116v-56zM944 688q16 -16 33 1l350 350q17 17 1 33t-33 -1l-350 -350q-17 -17 -1 -33zM1376 1280l92 92 q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68l-92 -92z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h255q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29v-259 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM256 704q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45l-384 -384 q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5t-38.5 114t-17.5 122z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3 q20 -8 20 -29v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM257 768q0 33 24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110q24 -24 24 -57t-24 -57l-814 -814q-24 -24 -57 -24t-57 24l-430 430 q-24 24 -24 57z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256 q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-710q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45 t-45 -19h-128q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M122 640q0 26 19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 -96v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31l-1328 -738q-23 -13 -39.5 -3t-16.5 36z" />
-<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM896 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32v710 q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
-<glyph unicode="" horiz-adv-x="1538" d="M1 64v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM1 525q-6 13 13 32l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13z" />
-<glyph unicode="" horiz-adv-x="1280" d="M154 704q0 26 19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1280" d="M90 128q0 26 19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19 t19 45v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19 t-19 -45v-128z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM387 414q0 -27 19 -46l90 -90q19 -19 46 -19q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19 l90 90q19 19 19 46q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 621q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45q0 28 -18 46l-91 90 q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM417 939q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26 t37.5 -59q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213zM640 160q0 -14 9 -23t23 -9 h192q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320 q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160zM640 1056q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160z" />
-<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143 q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45zM339 512q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5h-109q-26 0 -45 19 t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM429 480q0 13 10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23l-137 -137l137 -137q10 -10 10 -23t-10 -23l-146 -146q-10 -10 -23 -10t-23 10l-137 137 l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM346 640q0 26 19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45z" />
-<glyph unicode="" d="M0 643q0 157 61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5t-61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61t-245 164t-163.5 246t-61 300zM224 643q0 -162 89 -299l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199 t-73 -274zM471 185q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5q0 161 -87 295z" />
-<glyph unicode="" d="M64 576q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5t32.5 -90.5v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90 z" />
-<glyph unicode="" d="M0 512v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M53 565q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651q37 -39 37 -91q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75 q-38 38 -38 90z" />
-<glyph unicode="" horiz-adv-x="1664" d="M53 704q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 416q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45t-19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123 q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22t-13.5 30t-10.5 24q-127 285 -127 451z" />
-<glyph unicode="" d="M0 -64v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45zM781 800q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448 q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
-<glyph unicode="" d="M13 32q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23zM768 704v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10 t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M122.5 408.5q13.5 51.5 59.5 77.5l266 154l-266 154q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5 l-266 -154l266 -154q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 1126l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5l18 621q0 12 -10 18 q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18zM640 161q0 -13 10 -23t23 -10h192q13 0 22 9.5t9 23.5v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190z" />
-<glyph unicode="" d="M0 544v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68 t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23zM376 1120q0 -40 28 -68t68 -28h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68zM608 180q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5v56v468v192h-320v-192v-468v-56zM870 1024h194q40 0 68 28 t28 68t-28 68t-68 28q-43 0 -69 -31z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 121q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96 q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5zM384 448q0 -26 19 -45t45 -19q24 0 45 19 q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45t-19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 -160q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64zM256 640q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100 t113.5 -122.5t72.5 -150.5t27.5 -184q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 34 20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69t-20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69zM128 576q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5q-152 236 -381 353 q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 38 20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5q16 -10 16 -27q0 -7 -1 -9q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87 q-143 65 -263.5 173t-208.5 245q-20 31 -20 69zM128 576q167 -258 427 -375l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5zM896 0l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69t-20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95zM1056 286l280 502q8 -45 8 -84q0 -139 -79 -253.5t-209 -164.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M16 61l768 1408q17 31 47 49t65 18t65 -18t47 -49l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126zM752 992l17 -457q0 -10 10 -16.5t24 -6.5h185q14 0 23.5 6.5t10.5 16.5l18 459q0 12 -10 19q-13 11 -24 11h-220 q-11 0 -24 -11q-10 -7 -10 -21zM768 161q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 477q-1 13 9 25l96 97q9 9 23 9q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16 l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h288v288h-288v-288zM128 224 h288v320h-288v-320zM128 608h288v288h-288v-288zM384 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM480 -128h320v288h-320v-288zM480 224h320v320h-320v-320zM480 608h320v288h-320 v-288zM864 -128h320v288h-320v-288zM864 224h320v320h-320v-320zM864 608h320v288h-320v-288zM1152 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM1248 -128h288v288h-288v-288z M1248 224h288v320h-288v-320zM1248 608h288v288h-288v-288z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 160v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23zM0 1056v192q0 14 9 23t23 9h224q250 0 410 -225q-60 -92 -137 -273q-22 45 -37 72.5 t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23zM743 353q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 q-32 0 -85 -0.5t-81 -1t-73 1t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5 t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281z" />
-<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5 t-98.5 362zM0 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM1024 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M90 250.5q0 26.5 19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M90 773.5q0 26.5 19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 704q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45z M640 1120q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20z " />
-<glyph unicode="" horiz-adv-x="1664" d="M0 1216q0 26 19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024 q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45zM384 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1280 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5t-0.5 12.5zM73 56q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43 q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43z" />
-<glyph unicode="" horiz-adv-x="768" d="M64 64q0 26 19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v384h256v-384h-256zM640 128v896h256v-896h-256zM1024 128v640h256v-640h-256zM1408 128v1024h256v-1024h-256z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 286q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109 q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4q21 -63 74.5 -104 t121.5 -42q-116 -90 -261 -90q-26 0 -50 3z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544 q-119 0 -203.5 84.5t-84.5 203.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 0v1280q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM128 0h1536v128h-1536v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM256 1216h384v128h-384v-128zM512 574 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM640 574q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM736 576q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9 t9 23t-9 23t-23 9q-66 0 -113 -47t-47 -113z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 752q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41q0 -17 -49 -66t-66 -49 q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5zM192 768q0 -80 56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56 t56 136t-56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 549v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8 q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90 q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5zM384 640q0 -106 75 -181t181 -75 t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM1152 58v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0
-25 -51 -138q17 -23 30 -52q149 -15 149 -31 v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1152 1082v140q0 16 149 31q13 29 30 52 q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71 q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1408 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90zM1408 1152q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM616 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5 t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
-<glyph unicode="" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5 t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85 t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640z" />
-<glyph unicode="" d="M0 512v640q0 53 37.5 90.5t90.5 37.5h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186 q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5zM128 1088q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 512h32q16 0 35.5 -9 t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5 t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640z" />
-<glyph unicode="" horiz-adv-x="896" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z M128 940q0 -168 187 -355l581 -560l580 559q188 188 188 356q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5 t-21.5 -143z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5q0 -4 1 -20t0.5 -26.5t-3 -23.5 t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5zM384 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM223 1030q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86z M237 122h231v694h-231v-694zM595 122h231v388q0 38 7 56q15 35 45 59.5t74 24.5q116 0 116 -157v-371h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694z" />
-<glyph unicode="" horiz-adv-x="1152" d="M0 320q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19 t-19 45zM416 672q0 -14 9 -23t23 -9t23 9t9 23v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832 q-119 0 -203.5 84.5t-84.5 203.5zM685 576q0 13 10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
-<glyph unicode="" d="M0 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45zM894.5 78.5q0.5 10.5 3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113 t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5q0 4 -1 20t-0.5 26.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 928v128q0 40 28 68t68 28h288v96q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91t97.5 -37q75 0 133.5 -45.5 t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143zM128 928q0 -78 94.5 -162t235.5 -113q-74 162 -74 371 h-256v-96zM1206 653q141 29 235.5 113t94.5 162v96h-256q0 -209 -74 -371z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204 q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52 t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5h-224q-119 0 -203.5 84.5t-84.5 203.5zM271 315q3 5 13 2 q10 -5 7 -12q-5 -7 -13 -2q-10 5 -7 12zM304 290q6 6 16 -3q9 -11 2 -16q-6 -7 -16 3q-9 11 -2 16zM335 233q-9 13 0 18q9 7 17 -6q9 -12 0 -19q-8 -6 -17 7zM370 206q8 9 20 -3q12 -11 4 -19q-8 -9 -20 3q-13 11 -4 19zM419 168q4 11 19 7q
16 -5 13 -16q-4 -12 -19 -6 q-17 4 -13 15zM481 154q0 11 16 11q17 2 17 -11q0 -11 -16 -11q-17 -2 -17 11zM540 158q-2 12 14 15q16 2 18 -9q2 -10 -14 -14t-18 8z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -32v320q0 40 28 68t68 28h427q21 -56 70.5 -92t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 936q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69q-17 -40 -59 -40 h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40zM1152 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 433q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5q0 -165 -70 -327.5 t-196 -288t-281 -180.5q-124 -44 -326 -44q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5zM128 434q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5 q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24 q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 1069q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235 t235 -174q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5 t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832z" />
-<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62zM128 38l423 406l89 85l89 -85l423 -406 v1242h-1024v-1242z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 905q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5 q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5 t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M44 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5 q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145z" />
-<glyph unicode="" horiz-adv-x="1024" d="M95 631v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44 l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3 q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 96v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v608h-1664v-608zM128 1024h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600 q-13 0 -22.5 -9.5t-9.5 -22.5v-224zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 192q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 697v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5t259 -181.5q114 -113 181.5 -259t80.5 -306q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5 t-391.5 184.5q-25 2 -41.5 20t-16.5 43zM0 1201v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294q187 -186 294 -425.5t120 -501.5q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102 q-25 1 -42.5 19.5t-17.5 43.5z" />
-<glyph unicode="" d="M0 160v320q0 25 16 75l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM880 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1136 320q0 33 23.5 56.5t56.5 23.5 t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 672v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50 t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113zM768 633q377 -42 768 -341v954q-394 -302 -768 -343v-270z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
-<glyph unicode="" d="M2 435q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70l-53 -186l188 -48 q40 -10 52 -51q10 -42 -20 -70l-138 -135l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53 q-41 -12 -70 19q-31 29 -19 70l53 186l-188 48q-40 10 -52 51z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179q0 -105 -75.5 -181 t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q72 0 167 -32 t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139 q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106q-69 -57 -140 -57h-32v-640z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 769q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5v-640 q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181zM128 768q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119 q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5 t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5t-39 -89.5zM1536 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 640q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5t-90.5 -37.5h-640 q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5zM128 640q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140 v-32h640v32q0 72 32 167t64 193.5t32 179.5q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576q-20 0 -48.5 15t-55 33t-68 33t-84.5 15 q-67 0 -97.5 -44.5t-30.5 -115.5zM1152 -64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 640q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317q0 -142 -77.5 -230t-217.5 -87 l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5zM128 640q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33t55 33t48.5 15v-576q0 -50 38.5 -89 t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112 q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5zM1152 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM251 640q0 -27 18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM256 576q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18 l362 362l91 91q18 18 18 45t-18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 641q0 -27 18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19 t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45t-18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 639q0 -27 18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45t-18 45l-91 91 q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM226 979q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18 q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13 q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5 t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.
5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13 q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25 t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5 t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4 q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5q15 10 -7 16q-17 5 -43 -12q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.
5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8 q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5 q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26 q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5 q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -
4.5t-6 -4q-3 -4 0 -14t-2 -14 q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5 q-16 0 -22 -1q-146 -80 -235 -222zM877 26q0 -6 2 -16q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7 t-10 1.5t-11.5 -7q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M21 0q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90zM256
<TRUNCATED>
[56/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java b/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java
deleted file mode 100644
index 439806a..0000000
--- a/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package webapp;
-
-import de.agilecoders.wicket.core.Bootstrap;
-import de.agilecoders.wicket.core.settings.IBootstrapSettings;
-import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchTheme;
-import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchThemeProvider;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.Charset;
-import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-import com.google.common.base.Joiner;
-import com.google.common.io.Resources;
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.name.Names;
-import com.google.inject.util.Modules;
-import com.google.inject.util.Providers;
-import org.apache.wicket.Session;
-import org.apache.wicket.request.IRequestParameters;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Response;
-import org.apache.wicket.request.http.WebRequest;
-import org.apache.isis.viewer.wicket.viewer.IsisWicketApplication;
-import org.apache.isis.viewer.wicket.viewer.integration.wicket.AuthenticatedWebSessionForIsis;
-
-
-/**
- * As specified in <tt>web.xml</tt>.
- *
- * <p>
- * See:
- * <pre>
- * <filter>
- * <filter-name>wicket</filter-name>
- * <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
- * <init-param>
- * <param-name>applicationClassName</param-name>
- * <param-value>webapp.SimpleApplication</param-value>
- * </init-param>
- * </filter>
- * </pre>
- *
- */
-public class SimpleApplication extends IsisWicketApplication {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * uncomment for a (slightly hacky) way of allowing logins using query args, eg:
- *
- * <tt>?user=sven&pass=pass</tt>
- *
- * <p>
- * for demos only, obvious.
- */
- private final static boolean DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS = false;
-
-
- @Override
- protected void init() {
- super.init();
-
- IBootstrapSettings settings = Bootstrap.getSettings();
- settings.setThemeProvider(new BootswatchThemeProvider(BootswatchTheme.Flatly));
- }
-
- @Override
- public Session newSession(final Request request, final Response response) {
- if(!DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS) {
- return super.newSession(request, response);
- }
-
- // else demo mode
- final AuthenticatedWebSessionForIsis s = (AuthenticatedWebSessionForIsis) super.newSession(request, response);
- IRequestParameters requestParameters = request.getRequestParameters();
- final org.apache.wicket.util.string.StringValue user = requestParameters.getParameterValue("user");
- final org.apache.wicket.util.string.StringValue password = requestParameters.getParameterValue("pass");
- s.signIn(user.toString(), password.toString());
- return s;
- }
-
- @Override
- public WebRequest newWebRequest(HttpServletRequest servletRequest, String filterPath) {
- if(!DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS) {
- return super.newWebRequest(servletRequest, filterPath);
- }
-
- // else demo mode
- try {
- String uname = servletRequest.getParameter("user");
- if (uname != null) {
- servletRequest.getSession().invalidate();
- }
- } catch (Exception e) {
- }
- WebRequest request = super.newWebRequest(servletRequest, filterPath);
- return request;
- }
-
- @Override
- protected Module newIsisWicketModule() {
- final Module isisDefaults = super.newIsisWicketModule();
-
- final Module overrides = new AbstractModule() {
- @Override
- protected void configure() {
- bind(String.class).annotatedWith(Names.named("applicationName")).toInstance("Simple App");
- bind(String.class).annotatedWith(Names.named("applicationCss")).toInstance("css/application.css");
- bind(String.class).annotatedWith(Names.named("applicationJs")).toInstance("scripts/application.js");
- bind(String.class).annotatedWith(Names.named("welcomeMessage")).toInstance(readLines(getClass(), "welcome.html"));
- bind(String.class).annotatedWith(Names.named("aboutMessage")).toInstance("Simple App");
- bind(InputStream.class).annotatedWith(Names.named("metaInfManifest")).toProvider(Providers.of(getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF")));
- }
- };
-
- return Modules.override(isisDefaults).with(overrides);
- }
-
- private static String readLines(final Class<?> contextClass, final String resourceName) {
- try {
- List<String> readLines = Resources.readLines(Resources.getResource(contextClass, resourceName), Charset.defaultCharset());
- final String aboutText = Joiner.on("\n").join(readLines);
- return aboutText;
- } catch (IOException e) {
- return "This is a simple app";
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn
deleted file mode 100644
index 37543c9..0000000
Binary files a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png
deleted file mode 100644
index cd9ecfe..0000000
Binary files a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html b/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html
deleted file mode 100644
index 49cfbcd..0000000
--- a/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<p class="intro">
- <a href="http://isis.apache.org" target="_blank">Apache Isis</a>™ is a platform to let you rapidly develop
- domain-driven apps in Java.
- <br/>
- <br/>
- This app has been generated using Isis'
- <a href="http://isis.apache.org/intro/getting-started/simple%61pp-archetype.html" target="_blank">SimpleApp</a> archetype,
- which configures Isis' most commonly used components as part of a very simple and purposefully minimal application.
- <br/>
- <br/>
- The app itself consists of a single domain class, <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObject.java" target="_blank">SimpleObject</a>,
- along with an equally simple (factory/repository) domain service, <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObjects.java" target="_blank">SimpleObjects</a>.
- <br/>
- <br/>
- For more details, see the <a href="http://isis.apache.org/documentation.html" target="_blank">Isis website</a>.
-</p>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties
deleted file mode 100644
index 1f2c12c..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties
+++ /dev/null
@@ -1,233 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-#################################################################################
-#
-# specify system components.
-#
-# The values correspond to the named components in the installer-registry.properties file
-# in the org.apache.isis.core:isis-core-runtime JAR (in the org.apache.isis.core.runtime package)
-#
-# Although all configuration could reside in isis.properties, the recommendation is
-# to split out into component specific files:
-#
-# xxx_yyy.properties files
-#
-# where
-# * xxx is the component type, and
-# * yyy is the component name.
-#
-# For example, viewer_wicket.properties holds configuration information specific to the Wicket viewer.
-#
-#################################################################################
-
-
-#
-# configure the persistor (object store) to use
-#
-
-# JDO/DataNucleus objectstore
-isis.persistor=datanucleus
-
-
-
-#
-# configure authentication mechanism to use (to logon to the system)
-#
-
-#isis.authentication=bypass
-isis.authentication=shiro
-
-
-#
-# configure authorization mechanism to use
-#
-
-#isis.authorization=bypass
-isis.authorization=shiro
-
-
-
-
-
-#################################################################################
-#
-# MetaModel
-#
-# The metamodel typically does not require additional configuration, although
-# the system components (defined above) may refine the metamodel for their needs.
-#
-#################################################################################
-
-
-#
-# additional programming model facets
-#
-
-#isis.reflector.facets.include=
-#isis.reflector.facets.exclude=
-
-
-#
-# metamodel validator
-#
-
-#isis.reflector.validator=
-
-
-
-#
-# layoutMetadataReader(s)
-#
-
-# isis.reflector.layoutMetadataReaders=org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson
-
-
-
-#
-# patterns for applying CssClassFa facet (font-awesome icons) to member names
-#
-isis.reflector.facet.cssClassFa.patterns=new.*\:fa-plus,add.*\:fa-plus-square,create.*\:fa-plus,update.*\:fa-edit,change.*\:fa-edit,remove.*\:fa-minus-square,move.*\:fa-exchange,first.*\:fa-star,find.*\:fa-search,lookup.*\:fa-search,clear.*\:fa-remove,previous.*\:fa-step-backward,next.*\:fa-step-forward,list.*\:fa-list, all.*\:fa-list, download.*\:fa-download, upload.*\:fa-upload, execute.*\:fa-bolt, run.*\:fa-bolt, calculate.*\:fa-calculator, verify.*\:fa-check-circle, refresh.*\:fa-refresh, install.*\:fa-wrench
- new.*:fa-plus,\
- add.*:fa-plus-square,\
- create.*:fa-plus,\
- update.*:fa-edit,\
- change.*:fa-edit,\
- remove.*:fa-minus-square,\
- move.*:fa-exchange,\
- first.*:fa-star,\
- find.*:fa-search,\
- lookup.*:fa-search,\
- clear.*:fa-remove,\
- previous.*:fa-step-backward,\
- next.*:fa-step-forward,\
- list.*:fa-list, \
- all.*:fa-list, \
- download.*:fa-download, \
- upload.*:fa-upload, \
- execute.*:fa-bolt, \
- run.*:fa-bolt, \
- calculate.*:fa-calculator, \
- verify.*:fa-check-circle, \
- refresh.*:fa-refresh, \
- install.*:fa-wrench
-
-
-isis.reflector.facet.cssClass.patterns=update.*\:btn-default,delete.*\:btn-warning,.*\:btn-primary
- update.*:btn-default,\
- delete.*:btn-warning,\
- .*:btn-primary
-
-
-
-#################################################################################
-#
-# Value facet defaults
-#
-# (see also viewer-specific config files, eg viewer_wicket.properties)
-#
-#################################################################################
-
-# as used by @Title of a date
-isis.value.format.date=dd-MM-yyyy
-
-
-
-#################################################################################
-#
-# Facet Decorators
-#
-#################################################################################
-
-#
-# Providing such capabilities as i18n
-#
-
-isis.reflector.facet-decorators=org.apache.isis.core.metamodel.facetdecorator.i18n.resourcebundle.I18nDecoratorUsingResourceBundleInstaller
-
-
-#################################################################################
-#
-# Application Services and fixtures
-#
-#################################################################################
-
-#
-# Specify the domain services.
-#
-# These are the most important configuration properties in the system, as they define
-# the set of the classes for Isis to instantiate as domain service singletons.
-# From these domain service instances the rest of the metamodel is discovered, while the
-# end-user gains access to other domain objects by invoking the actions of the domain services.
-#
-isis.services-installer=configuration-and-annotation
-isis.services.ServicesInstallerFromAnnotation.packagePrefix=dom.simple,fixture.simple,webapp.prototyping
- fixture.simple,\
- webapp.prototyping
-
-isis.services = org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,\
- com.sprint.isis.neo4j.server.Wrapper, \
- # customizable exception handling, \
- org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
- org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,
-
-
-# Specify the (optional) test fixtures
-#
-# Fixtures are used to seed the object store with an initial set of data. For the
-# in-memory object store, the fixtures are installed on every run. For other
-# object stores, they are used only when the object store is first initialized.
-#
-isis.fixtures=fixture.simple.scenario.SimpleObjectsFixture
-
-
-#
-# whether ExceptionRecognizers should also log any recognized exceptions
-# (default false; enable for diagnostics/debugging)
-#
-#isis.services.exceprecog.logRecognizedExceptions=true
-
-
-#
-# Audit changes to all objects; can opt out using @Audited(disabled=true)
-#
-#isis.services.audit.objects=all|none
-
-#
-# Treat all actions as commands; can opt out using @Command(disabled=true)
-#
-#isis.services.command.actions=all|none|ignoreQueryOnly
-
-
-
-
-################################################################################
-#
-# Viewer defaults
-#
-#################################################################################
-
-#
-# Specify viewer defaults
-#
-#isis.viewers.paged.standalone=30
-#isis.viewers.paged.parented=10
-
-
-#isis.viewers.propertyLayout.labelPosition=LEFT
-#isis.viewers.parameterLayout.labelPosition=LEFT
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties
deleted file mode 100644
index 0467c62..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties
+++ /dev/null
@@ -1,185 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-#
-# Isis uses log4j is used to provide system logging
-#
-log4j.rootCategory=INFO, Console
-#log4j.rootCategory=DEBUG, Console
-
-
-# The console appender
-log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.target=System.out
-log4j.appender.Console.layout=org.apache.log4j.PatternLayout
-log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n
-
-
-# The stderr appender
-log4j.appender.Stderr=org.apache.log4j.ConsoleAppender
-log4j.appender.Stderr.target=System.err
-log4j.appender.Stderr.layout=org.apache.log4j.PatternLayout
-log4j.appender.Stderr.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n
-
-
-# other appenders
-log4j.appender.File=org.apache.log4j.RollingFileAppender
-log4j.appender.File.file=isis.log
-log4j.appender.File.append=false
-log4j.appender.File.layout=org.apache.log4j.PatternLayout
-log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p] %m%n
-
-log4j.appender.sql=org.apache.log4j.FileAppender
-log4j.appender.sql.File=./logs/sql.log
-log4j.appender.sql.Append=false
-log4j.appender.sql.layout=org.apache.log4j.PatternLayout
-log4j.appender.sql.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n
-
-log4j.appender.sqltiming=org.apache.log4j.FileAppender
-log4j.appender.sqltiming.File=./logs/sqltiming.log
-log4j.appender.sqltiming.Append=false
-log4j.appender.sqltiming.layout=org.apache.log4j.PatternLayout
-log4j.appender.sqltiming.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n
-
-log4j.appender.jdbc=org.apache.log4j.FileAppender
-log4j.appender.jdbc.File=./logs/jdbc.log
-log4j.appender.jdbc.Append=false
-log4j.appender.jdbc.layout=org.apache.log4j.PatternLayout
-log4j.appender.jdbc.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
-
-log4j.appender.connection=org.apache.log4j.FileAppender
-log4j.appender.connection.File=./logs/connection.log
-log4j.appender.connection.Append=false
-log4j.appender.connection.layout=org.apache.log4j.PatternLayout
-log4j.appender.connection.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
-
-
-
-
-
-! turn on the internal log4j debugging flag so we can see what it is doing
-#log4j.debug=true
-
-
-# DataNucleus
-# the first two log the DML and DDL (if set to DEBUG)
-log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console
-log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console
-# the remainder can probably be left to WARN
-log4j.logger.DataNucleus.Persistence=WARN, Console
-log4j.logger.DataNucleus.Transaction=WARN, Console
-log4j.logger.DataNucleus.Connection=WARN, Console
-log4j.logger.DataNucleus.Query=WARN, Console
-log4j.logger.DataNucleus.Cache=WARN, Console
-log4j.logger.DataNucleus.MetaData=WARN, Console
-log4j.logger.DataNucleus.Datastore=WARN, Console
-log4j.logger.DataNucleus.Datastore.Persist=WARN, Console
-log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console
-log4j.logger.DataNucleus.General=WARN, Console
-log4j.logger.DataNucleus.Lifecycle=WARN, Console
-log4j.logger.DataNucleus.ValueGeneration=WARN, Console
-log4j.logger.DataNucleus.Enhancer=WARN, Console
-log4j.logger.DataNucleus.SchemaTool=ERROR, Console
-log4j.logger.DataNucleus.JDO=WARN, Console
-log4j.logger.DataNucleus.JPA=ERROR, Console
-log4j.logger.DataNucleus.JCA=WARN, Console
-log4j.logger.DataNucleus.IDE=ERROR, Console
-
-log4j.additivity.DataNucleus.Datastore.Native=false
-log4j.additivity.DataNucleus.Datastore.Schema=false
-log4j.additivity.DataNucleus.Datastore.Persistence=false
-log4j.additivity.DataNucleus.Datastore.Transaction=false
-log4j.additivity.DataNucleus.Datastore.Connection=false
-log4j.additivity.DataNucleus.Datastore.Query=false
-log4j.additivity.DataNucleus.Datastore.Cache=false
-log4j.additivity.DataNucleus.Datastore.MetaData=false
-log4j.additivity.DataNucleus.Datastore.Datastore=false
-log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false
-log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false
-log4j.additivity.DataNucleus.Datastore.General=false
-log4j.additivity.DataNucleus.Datastore.Lifecycle=false
-log4j.additivity.DataNucleus.Datastore.ValueGeneration=false
-log4j.additivity.DataNucleus.Datastore.Enhancer=false
-log4j.additivity.DataNucleus.Datastore.SchemaTool=false
-log4j.additivity.DataNucleus.Datastore.JDO=false
-log4j.additivity.DataNucleus.Datastore.JPA=false
-log4j.additivity.DataNucleus.Datastore.JCA=false
-log4j.additivity.DataNucleus.Datastore.IDE=false
-
-
-# if using log4jdbc-remix as JDBC driver
-#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console
-#log4j.additivity.jdbc.sqlonly=false
-#log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console
-#log4j.additivity.jdbc.resultsettable=false
-
-#log4j.logger.jdbc.audit=WARN,jdbc, Console
-#log4j.additivity.jdbc.audit=false
-#log4j.logger.jdbc.resultset=WARN,jdbc
-#log4j.additivity.jdbc.resultset=false
-#log4j.logger.jdbc.sqltiming=WARN,sqltiming
-#log4j.additivity.jdbc.sqltiming=false
-#log4j.logger.jdbc.connection=FATAL,connection
-#log4j.additivity.jdbc.connection=false
-
-
-
-# track Isis/JDO lifecycle integration
-
-#log4j.logger.org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.persistence.FrameworkSynchronizer=DEBUG, Console
-#log4j.additivity.org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.persistence.FrameworkSynchronizer=false
-
-#log4j.logger.org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener=DEBUG,Console
-#log4j.additivity.org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener=false
-
-
-
-
-# track Isis/Wicket lifecycle integration
-
-#log4j.logger.org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis=DEBUG, Console
-#log4j.additivity.org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis=false
-
-#log4j.logger.org.apache.isis.viewer.wicket.viewer.integration.isis.IsisContextForWicket=INFO,Console
-#log4j.additivity.org.apache.isis.viewer.wicket.viewer.integration.isis.IsisContextForWicket=false
-
-
-
-
-# quieten some of the noisier classes in Isis' bootstrapping
-log4j.logger.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=WARN,Console
-log4j.additivity.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=false
-
-log4j.logger.org.apache.isis.core.metamodel.specloader.ServiceInitializer=WARN,Console
-log4j.additivity.org.apache.isis.core.metamodel.specloader.ServiceInitializer=false
-
-log4j.logger.org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration=WARN,Console
-log4j.additivity.org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration=false
-
-log4j.logger.org.apache.isis.core.commons.config.IsisConfigurationDefault=WARN,Console
-log4j.additivity.org.apache.isis.core.commons.config.IsisConfigurationDefault=false
-
-log4j.logger.org.apache.isis.core.runtime.installers.InstallerLookupDefault=WARN,Console
-log4j.additivity.org.apache.isis.core.runtime.installers.InstallerLookupDefault=false
-
-
-
-
-# Application-specific logging
-log4j.logger.dom.todo.ToDoItem=DEBUG, Stderr
-log4j.additivity.dom.todo.ToDoItem=false
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
deleted file mode 100644
index d60a45f..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-
-#################################################################################
-#
-# Persistor
-#
-#################################################################################
-
-
-
-# generally speaking this should not be enabled
-isis.persistor.disableConcurrencyChecking=false
-
-
-
-
-#################################################################################
-#
-# JDBC configuration
-#
-#################################################################################
-
-#
-# configuration file holding the JDO objectstore's JDBC configuration
-# (this is a bit of a hack... just exploiting fact that Isis also loads this file)
-#
-
-
-#
-# JDBC connection details
-# (also update the pom.xml to reference the appropriate JDBC driver)
-#
-
-#
-# neo4j
-#
-isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=neo4j:testDB
-
-#
-# HSQLDB in-memory
-#
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:hsqldb:mem:test
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
-
-#
-# HSQLDB in-memory (using log4jdbc-remix)
-#
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:hsqldb:mem:test
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
-
-
-
-#
-# HSQLDB to file
-#
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:hsqldb:file:/tmp/isis-simple-app/hsql-db;hsqldb.write_delay=false;shutdown=true
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
-
-#
-# HSQLDB to file (using log4jdbc-remix)
-#
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:hsqldb:file:/tmp/isis-simple-app/hsql-db;hsqldb.write_delay=false;shutdown=true
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
-
-
-
-#
-# PostgreSQL Server
-#
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.postgresql.Driver
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:postgresql://localhost:5432/isis
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=isis
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=isis
-
-#
-# PostgreSQL Server (using log4jdbc-remix)
-#
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:postgresql://localhost:5432/isis
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=isis
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=isis
-
-
-
-#
-# MS SQL Server
-#
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=com.microsoft.sqlserver.jdbc.SQLServerDriver
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:sqlserver://127.0.0.1:1433;instance=.;databaseName=simple
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=p4ssword
-
-#
-# MS SQL Server (using log4jdbc-remix)
-#
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:sqlserver://127.0.0.1:1433;instance=SQLEXPRESS;databaseName=jdo
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=jdo
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=jdopass
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
deleted file mode 100644
index 2f41400..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
+++ /dev/null
@@ -1,104 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-#
-# configuration file for the JDO/DataNucleus objectstore
-#
-
-# identifies @PersistenceCapable entities to be eagerly registered
-# if move class to other package (eg com.mycompany.myapp.dom) then update
-isis.persistor.datanucleus.RegisterEntities.packagePrefix=dom
-
-# whether to persist the event data as a "clob" or as a "zipped" byte[]
-# default is "zipped"
-#isis.persistor.datanucleus.PublishingService.serializedForm=zipped
-
-
-#####################################################################
-#
-# DataNucleus' configuration
-#
-# The 'isis.persistor.datanucleus.impl' prefix is stripped off,
-# remainder is passed through to DataNucleus
-#
-#####################################################################
-
-isis.persistor.datanucleus.impl.datanucleus.autoCreateSchema=true
-isis.persistor.datanucleus.impl.datanucleus.validateTables=true
-isis.persistor.datanucleus.impl.datanucleus.validateConstraints=true
-
-
-#
-# Require explicit persistence (since entities are Comparable and using ObjectContracts#compareTo).
-# see http://www.datanucleus.org/products/accessplatform_3_0/jdo/transaction_types.html
-#
-isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false
-
-
-#
-# How column names are identified
-# (http://www.datanucleus.org/products/datanucleus/jdo/orm/datastore_identifiers.html)
-#
-isis.persistor.datanucleus.impl.datanucleus.identifier.case=PreserveCase
-
-isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll=true
-isis.persistor.datanucleus.impl.datanucleus.schema.validateTables=true
-isis.persistor.datanucleus.impl.datanucleus.schema.validateConstraints=true
-
-
-#
-# Require explicit persistence (since entities are Comparable and using ObjectContracts#compareTo).
-# see http://www.datanucleus.org/products/accessplatform_3_0/jdo/transaction_types.html
-#
-isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false
-
-
-#
-# How column names are identified
-# (http://www.datanucleus.org/products/datanucleus/jdo/orm/datastore_identifiers.html)
-#
-isis.persistor.datanucleus.impl.datanucleus.identifier.case=MixedCase
-
-#
-# L2 cache
-# off except if explicitly marked as cacheable
-# http://www.datanucleus.org/products/datanucleus/jdo/cache.html
-#
-isis.persistor.datanucleus.impl.datanucleus.cache.level2.type=none
-isis.persistor.datanucleus.impl.datanucleus.cache.level2.mode=ENABLE_SELECTIVE
-
-
-
-#
-# uncomment to use JNDI rather than direct JDBC
-#
-#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactoryName=java:comp/env/jdbc/quickstart
-
-#
-# uncomment to use JTA resource
-#
-#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactory2Name=java:comp/env/jdbc/quickstart-nontx
-#isis.persistor.datanucleus.impl.javax.jdo.option.TransactionType=JTA
-
-
-
-#
-#
-# JDBC connection details
-# ... are in persistor.properties
-#
-#
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini
deleted file mode 100644
index a643d86..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini
+++ /dev/null
@@ -1,93 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-[main]
-
-contextFactory = org.apache.isis.security.shiro.IsisLdapContextFactory
-contextFactory.url = ldap://localhost:10389
-contextFactory.authenticationMechanism = CRAM-MD5
-contextFactory.systemAuthenticationMechanism = simple
-contextFactory.systemUsername = uid=admin,ou=system
-contextFactory.systemPassword = secret
-
-ldapRealm = org.apache.isis.security.shiro.IsisLdapRealm
-ldapRealm.contextFactory = $contextFactory
-
-ldapRealm.searchBase = ou=groups,o=mojo
-ldapRealm.groupObjectClass = groupOfUniqueNames
-ldapRealm.uniqueMemberAttribute = uniqueMember
-ldapRealm.uniqueMemberAttributeValueTemplate = uid={0}
-
-# optional mapping from physical groups to logical application roles
-#ldapRealm.rolesByGroup = \
-# LDN_USERS: user_role,\
-# NYK_USERS: user_role,\
-# HKG_USERS: user_role,\
-# GLOBAL_ADMIN: admin_role,\
-# DEMOS: self-install_role
-
-ldapRealm.permissionsByRole=\
- user_role = *:ToDoItemsJdo:*:*,\
- *:ToDoItem:*:*; \
- self-install_role = *:ToDoItemsFixturesService:install:* ; \
- admin_role = *
-
-# to use ldap...
-# (see docs for details of how to setup users/groups in Apache Directory Studio).
-#securityManager.realms = $ldapRealm
-
-# to use .ini file
-securityManager.realms = $iniRealm
-
-
-
-# -----------------------------------------------------------------------------
-# Users and their assigned roles
-#
-# Each line conforms to the format defined in the
-# org.apache.shiro.realm.text.TextConfigurationRealm#setUserDefinitions JavaDoc
-# -----------------------------------------------------------------------------
-
-[users]
-# user = password, role1, role2, role3, ...
-
-
-sven = pass, admin_role
-dick = pass, user_role, self-install_role
-bob = pass, user_role, self-install_role
-joe = pass, user_role, self-install_role
-guest = guest, user_role
-
-
-
-# -----------------------------------------------------------------------------
-# Roles with assigned permissions
-#
-# Each line conforms to the format defined in the
-# org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions JavaDoc
-# -----------------------------------------------------------------------------
-
-[roles]
-# role = perm1, perm2, perm3, ...
-# perm in format: packageName:className:memberName:r,w
-
-user_role = *:ToDoItemsJdo:*:*,\
- *:ToDoItem:*:*
-self-install_role = *:ToDoItemsFixturesService:install:*
-admin_role = *
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
deleted file mode 100644
index 0a85fb6..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
+++ /dev/null
@@ -1,66 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-#
-# configuration file for the Restful Objects viewer
-#
-
-# the baseUrl for hrefs in the events generated by the RO EventSerializer
-isis.viewer.restfulobjects.RestfulObjectsSpecEventSerializer.baseUrl=http://localhost:8080/restful/
-
-# renders param details in the (incorrect) form that they were for GSOC2013 viewers
-# isis.viewer.restfulobjects.gsoc2013.legacyParamDetails=true
-
-# whether to honor UI hints, in particular Render(EAGERLY). Defaults to false.
-#isis.viewer.restfulobjects.honorUiHints=false
-
-
-
-###############################################################################
-# Non-standard configuration settings.
-#
-# If enabled of the following are enabled then the viewer is deviating from the
-# RO spec standard; compatibility may be compromised with RO clients.
-###############################################################################
-
-# whether to show only object properties for object members
-# (on the object representation only)
-# Takes precedence over the other 'suppress' below.
-#isis.viewer.restfulobjects.objectPropertyValuesOnly=true
-
-# whether to suppress "describedby" links. Defaults to false.
-#isis.viewer.restfulobjects.suppressDescribedByLinks=true
-
-# whether to suppress "update" links. Defaults to false.
-#isis.viewer.restfulobjects.suppressUpdateLink=true
-
-# whether to suppress "id" json-prop for object members. Defaults to false.
-#isis.viewer.restfulobjects.suppressMemberId=true
-
-# whether to suppress "links" json-prop for object members
-# (on the object representation only). Defaults to false.
-#isis.viewer.restfulobjects.suppressMemberLinks=true
-
-# whether to suppress "extensions" json-prop for object members
-# (on the object representation only). Defaults to false.
-#isis.viewer.restfulobjects.suppressMemberExtensions=true
-
-# whether to suppress "disabledReason" json-prop for object members
-# (on the object representation only). Defaults to false.
-#isis.viewer.restfulobjects.suppressMemberDisabledReason=true
-
-###############################################################################
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties
deleted file mode 100644
index 79ddf66..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties
+++ /dev/null
@@ -1,84 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-#
-# configuration file for the Wicket viewer
-#
-
-#
-# The maximum length of titles to display in standalone or parented tables.
-# Titles longer than this length will be truncated with trailing ellipses (...)
-#
-# For example, if set to 12, the title
-# "Buy milk on 15-Feb-13" will be truncated to "Buy milk ..."
-#
-# If set to 0, then only the icon will be shown.
-#
-isis.viewer.wicket.maxTitleLengthInStandaloneTables=0
-isis.viewer.wicket.maxTitleLengthInParentedTables=0
-
-
-#isis.viewer.wicket.datePattern=dd-MM-yyyy
-#isis.viewer.wicket.dateTimePattern=dd-MM-yyyy HH:mm
-#isis.viewer.wicket.datePickerPattern=DD-MM-YYYY
-
-#isis.viewer.wicket.datePattern=dd/MM/yy
-#isis.viewer.wicket.dateTimePattern=dd/MM/yy HH:mm
-#isis.viewer.wicket.datePickerPattern=DD/MM/YY
-
-
-#
-# whether to strip wicket tags from markup (default is true, as they may break some CSS rules)
-#
-#isis.viewer.wicket.stripWicketTags=false
-
-
-#
-# whether to suppress the 'rememberMe' checkbox on the login page (default is false)
-#
-#isis.viewer.wicket.suppressRememberMe=false
-
-#
-# if user attempts to access a protected URL before signing in, then as a convenience the viewer will continue
-# through to that destination after successful login. If you consider this to be a security risk then this flag
-# disables that behaviour (default is false).
-#
-#isis.viewer.wicket.clearOriginalDestination=true
-
-
-#
-# whether to show action dialogs on their own page rather than as a modal dialog (default is false)
-#
-#isis.viewer.wicket.disableModalDialogs=false
-
-
-#
-# the maximum number of pages to list in bookmark (default is 15)
-#
-#isis.viewer.wicket.bookmarkedPages.maxSize=15
-
-
-#
-# whether to show the bootstrap theme chooser (defaults false)
-#
-#isis.viewer.wicket.themes.showChooser=false
-isis.viewer.wicket.themes.showChooser=true
-
-#
-# comma-separated list of themes to choose from (default is to show all themes from bootswatch.com).
-#
-#isis.viewer.wicket.themes.enabled=bootstrap-theme,Cosmo,Flatly,Darkly,Sandstone,United
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index b169b00..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,309 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<web-app id="WebApp_ID" version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
-
- <display-name>Simple app</display-name>
-
- <welcome-file-list>
- <welcome-file>about/index.html</welcome-file>
- </welcome-file-list>
-
- <!-- shiro security configuration -->
- <listener>
- <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
- </listener>
-
- <filter>
- <filter-name>ShiroFilter</filter-name>
- <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
- </filter>
-
- <filter-mapping>
- <filter-name>ShiroFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
-
-
- <!-- which configuration directory to read overloaded property files from -->
- <!--
- Normally configuration like this should be done from outside your web
- application. Especially if your configuration is not know in advance or
- if it can change depending on where the application gets deployed.
-
- For instance to configure this in Tomcat outside the application WAR add
- the following line to your application context ( For more detail see:
- http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Context_Parameters )
-
- <Parameter name="isis.config.dir" value="/usr/local/tomcat/conf/"
- override="true"/>
-
- If your configuration directory is fixed you can enable the following
- context parameter in here and forget about the outside part.
-
- <context-param>
- <param-name>isis.config.dir</param-name>
- <param-value>location of your config directory if fixed</param-value>
- </context-param>
- -->
-
-
- <!--
- determines which additional configuration files to search for
- -->
- <context-param>
- <param-name>isis.viewers</param-name>
- <param-value>wicket,restfulobjects</param-value>
- </context-param>
-
-
-
- <!--
- for diagnostics
- -->
- <filter>
- <filter-name>IsisLogOnExceptionFilter</filter-name>
- <filter-class>org.apache.isis.core.webapp.diagnostics.IsisLogOnExceptionFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>IsisLogOnExceptionFilter</filter-name>
- <url-pattern>/wicket/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>IsisLogOnExceptionFilter</filter-name>
- <url-pattern>/restful/*</url-pattern>
- </filter-mapping>
-
-
-
- <!-- cache static resources for 1 day -->
- <filter>
- <filter-name>ResourceCachingFilter</filter-name>
- <filter-class>org.apache.isis.core.webapp.content.ResourceCachingFilter</filter-class>
- <init-param>
- <param-name>CacheTime</param-name>
- <param-value>86400</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>ResourceCachingFilter</filter-name>
- <url-pattern>*.js</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>ResourceCachingFilter</filter-name>
- <url-pattern>*.css</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>ResourceCachingFilter</filter-name>
- <url-pattern>*.png</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>ResourceCachingFilter</filter-name>
- <url-pattern>*.jpg</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>ResourceCachingFilter</filter-name>
- <url-pattern>*.gif</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>ResourceCachingFilter</filter-name>
- <url-pattern>*.html</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>ResourceCachingFilter</filter-name>
- <url-pattern>*.swf</url-pattern>
- </filter-mapping>
-
- <servlet>
- <servlet-name>Resource</servlet-name>
- <servlet-class>org.apache.isis.core.webapp.content.ResourceServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>Resource</servlet-name>
- <url-pattern>*.css</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>Resource</servlet-name>
- <url-pattern>*.png</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>Resource</servlet-name>
- <url-pattern>*.jpg</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>Resource</servlet-name>
- <url-pattern>*.gif</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>Resource</servlet-name>
- <url-pattern>*.js</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>Resource</servlet-name>
- <url-pattern>*.html</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>Resource</servlet-name>
- <url-pattern>*.swf</url-pattern>
- </servlet-mapping>
-
-
-
- <!--
- -
- - config specific to the wicket-viewer
- -
- -->
- <filter>
- <filter-name>WicketFilter</filter-name>
- <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
- <init-param>
- <param-name>applicationClassName</param-name>
- <param-value>webapp.SimpleApplication</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>WicketFilter</filter-name>
- <url-pattern>/wicket/*</url-pattern>
- </filter-mapping>
-
-
- <context-param>
- <param-name>configuration</param-name>
- <!--
- <param-value>deployment</param-value>
- -->
- <param-value>development</param-value>
- </context-param>
-
-
- <!--
- -
- - config specific to the restfulobjects-viewer
- -
- -->
-
- <!--
- THE FOLLOWING CONFIGURATION IS NOT REQUIRED IF THE WICKET VIEWER IS IN USE.
- IF THE WICKET VIEWER CONFIGURATION IS REMOVED, THEN UNCOMMENT
-
- <listener>
- <listener-class>org.apache.isis.core.webapp.IsisWebAppBootstrapper</listener-class>
- </listener>
-
- <context-param>
- <param-name>deploymentType</param-name>
- <param-value>SERVER_EXPLORATION</param-value>
- </context-param>
-
- <context-param>
- <param-name>isis.viewers</param-name>
- <param-value>restfulobjects</param-value>
- </context-param>
- -->
-
- <!-- bootstrap the RestEasy framework -->
- <listener>
- <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
- </listener>
-
- <!-- used by RestEasy to determine the JAX-RS resources and other related configuration -->
- <context-param>
- <param-name>javax.ws.rs.Application</param-name>
- <param-value>org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplication</param-value>
- </context-param>
-
- <context-param>
- <param-name>resteasy.servlet.mapping.prefix</param-name>
- <param-value>/restful/</param-value>
- </context-param>
-
-
- <!-- authenticate user, set up an Isis session -->
- <filter>
- <filter-name>IsisSessionFilterForRestfulObjects</filter-name>
- <filter-class>org.apache.isis.core.webapp.IsisSessionFilter</filter-class>
- <!-- authentication required for REST -->
- <init-param>
- <param-name>authenticationSessionStrategy</param-name>
- <param-value>org.apache.isis.viewer.restfulobjects.server.authentication.AuthenticationSessionStrategyBasicAuth</param-value>
- </init-param>
- <init-param>
- <!-- what to do if no session was found; we indicate to issue a 401 basic authentication challenge -->
- <param-name>whenNoSession</param-name>
- <param-value>basicAuthChallenge</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <!-- this is mapped to the entire app; however the IsisSessionFilter will "notice" if the session filter has already been
- executed for the request pipeline, and if so will do nothing -->
- <filter-name>IsisSessionFilterForRestfulObjects</filter-name>
- <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
- </filter-mapping>
-
- <filter>
- <filter-name>IsisTransactionFilterForRestfulObjects</filter-name>
- <filter-class>org.apache.isis.viewer.restfulobjects.server.webapp.IsisTransactionFilterForRestfulObjects</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>IsisTransactionFilterForRestfulObjects</filter-name>
- <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
- </filter-mapping>
-
-
- <servlet>
- <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
- <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
- <url-pattern>/restful/*</url-pattern>
- </servlet-mapping>
-
-
- <!--
- uncomment to use container-managed datasource;
- for both container-managed (JTA) and non-container-managed transactions
- -->
- <!--
- <resource-ref>
- <description>db</description>
- <res-ref-name>jdbc/quickstart</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
- -->
-
- <!--
- uncomment to use container-managed datasource
- with container-managed transactions (JTA).
- -->
- <!--
- <resource-ref>
- <description>db</description>
- <res-ref-name>jdbc/quickstart-nontx</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
- -->
-
-</web-app>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png b/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png
deleted file mode 100644
index 5284fe7..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/about/index.html
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/about/index.html b/example/application/neoapp/webapp/src/main/webapp/about/index.html
deleted file mode 100644
index b623158..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/about/index.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>Apache Isis™ SimpleApp</title>
-
- <style type="text/css">
-body {
- background-color: #1A467B;
- font-family: Verdana, Helvetica, Arial;
- font-size: 90%;
-}
-
-li {
- margin-top: 6px;
- margin-bottom: 6px;
-}
-table {
- border-collapse: collapse;
-}
-table, th, td {
- border: 1px;
- border-style: solid;
- border-color: lightgray;
-}
-th, td {
- padding: 10px;
-}
-#wrapper {
- background-color: #ffffff;
- width: 900px;
- margin: 8px auto;
- padding: 12px;
-}
- </style>
- </head>
- <body>
- <div id="wrapper">
- <img alt="Isis Logo" src="about/images/isis-logo.png" />
-
- <p>
- <a href="http://isis.apache.org" target="_blank">Apache Isis</a>™ is a framework to let you rapidly develop
- domain-driven apps in Java. This app has been generated using Isis'
- <a href="http://isis.apache.org/intro/getting-started/simple%61pp-archetype.html" target="_blank">SimpleApp</a> archetype,
- which configures Isis to run a very simple and purposefully minimal application.
-
- <p>
- The app itself consists of a single domain class,
- <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObject.java" target="_blank"><tt>SimpleObject</tt></a>,
- along with an equally simple (factory/repository) domain service, <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObjects.java" target="_blank"><tt>SimpleObjects</tt></a>.
- </p>
-
- <p>To access the app:</p>
- <ul>
- <li>
- <p>
- <b><a href="wicket/">wicket/</a></b>
- </p>
- <p>
- provides accesses to a generic UI for end-users,
- Isis' <a href="http://isis.apache.org/components/viewers/wicket/about.html" target="_blank">Wicket Viewer</a>.
- As its name suggests, this viewer is built on top of <a href="http://wicket.apache.org" target="_blank">Apache Wicket</a>™.
- </p>
- </li>
- <li>
- <p>
- <b>
- <a href="restful/">restful/</a>
- </b>
- </p>
- <p>
- provides access to a RESTful API conformant with the
- <a href="http://restfulobjects.org">Restful Objects</a> spec</td>. This is part of Isis Core. The
- implementation technology is JBoss RestEasy.
- </p>
- </li>
- <li>
- <p>
- <b>
- <a href="cy2neo/index.html">cy2neo/</a>
- </b>
- </p>
- <p>
- provides a lightweight graph DB visualizer.
- </p>
- </li>
- </ul>
-
- <p>
- The default user/password is <b><i>sven/pass</i></b> (as configured in the
- <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/webapp/src/main/webapp/WEB-INF/shiro.ini" target="_blank">shiro.ini</a> file).
- </p>
-
- </div>
- </body>
-</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/css/application.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/css/application.css b/example/application/neoapp/webapp/src/main/webapp/css/application.css
deleted file mode 100644
index 9f1612a..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/css/application.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/bower.json
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/bower.json b/example/application/neoapp/webapp/src/main/webapp/cy2neo/bower.json
deleted file mode 100644
index a3f7a95..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/bower.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "cy2neo",
- "version": "0.0.1",
- "authors": [
- "Michael Hunger <gi...@jexp.de>"
- ],
- "description": "Cy2Neo Tiny Neo4j Cypher Workbench with Alchemy.js Viz",
- "main": "cy2neo.js",
- "keywords": [
- "neo4j",
- "cypher",
- "graph",
- "database",
- "repl",
- "shell",
- "console",
- "graphviz",
- "d3",
- "graph"
- ],
- "license": "MIT",
- "homepage": "http://jexp.github.io/cy2neo",
- "private": true,
- "ignore": [
- "**/.*",
- "node_modules",
- "bower_components",
- "test",
- "tests"
- ]
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/index.html
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/index.html b/example/application/neoapp/webapp/src/main/webapp/cy2neo/index.html
deleted file mode 100644
index 6f06a53..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/index.html
+++ /dev/null
@@ -1,135 +0,0 @@
-<html>
-<head>
-<link rel="stylesheet" href="../scripts/alchemy/styles/vendor.css">
-<link rel="stylesheet" href="../scripts/alchemy/alchemy.css">
-<link rel="stylesheet" href="styles/codemirror.css">
-<link rel="stylesheet" href="styles/codemirror-neo.css">
-<link rel="stylesheet" href="styles/cy2neo.css">
-<link rel="stylesheet" href="styles/gh-fork-ribbon.css">
-<link rel="shortcut icon" href="a70134cc.alchemyFlatfavicon.ico">
-<title>Cy2Neo - Tiny Neo4j Cypher Workbench</title>
-</head>
-<body>
- <div>
- <input class="form-control" type="url" value="http://localhost:7474" id="neo4jUrl"/>
- <textarea name="cypher" id="cypher" rows="4" cols="120" data-lang="cypher" class="code form-control">
-START x = node(*)
-MATCH (x)-[r?]->(m)
-RETURN x, r
-
- </textarea>
- <a href="#" title="Execute" id="execute"><i class="fa fa-play-circle-o"></i></a>
- </div>
-
-<div class="alchemy tab-pane active" id="graph"></div>
-
-<!-- <ul class="nav nav-tabs" role="tablist">
- <li class="active"><a href="#graph" role="tab" data-toggle="tab">Graph</a></li>
- <li><a href="#table" role="tab" data-toggle="tab">Table</a></li>
-</ul> -->
-
-<!-- <div class="tab-content">
- <div class="alchemy tab-pane active" id="graph"></div>
- <div class="tab-pane" id="table">table</div>
-</div> -->
-<div id="alchemy" class="alchemy"></div>
-
-<div class="github-fork-ribbon-wrapper right-bottom">
- <div class="github-fork-ribbon">
- <a href="https://github.com/jexp/cy2neo">Fork me on GitHub</a>
- </div>
-</div>
-
-
-<script src="scripts/codemirror.js"></script>
-<script src="scripts/codemirror-cypher.js"></script>
-<script src="scripts/alchemyConfig.js"></script>
-<script src="../scripts/alchemy/scripts/vendor.js"></script>
-<script src="../scripts/alchemy/alchemy.js"></script>
-<script src="scripts/neo.js"></script>
-
-<style type="text/css" media="screen">
-/* todo dynamic CSS */
- .Movie circle {
- fill: #00ff0e;
- stroke: #00ffda;
- }
-
- .Person circle {
- fill: #ff7921;
- stroke: #4f07ff;
- }
-</style>
-<script type="text/javascript">
-
- function createEditor() {
- return CodeMirror.fromTextArea(document.getElementById("cypher"), {
- parserfile: ["scripts/codemirror-cypher.js"],
- path: "scripts",
- stylesheet: "styles/codemirror-neo.css",
- autoMatchParens: true,
- lineNumbers: true,
- enterMode: "keep",
- value: "some value"
- });
- }
-
-
- $(document).ready(function() {
-
- //todo dynamic configuration
- //config.nodeTypes = "label"; // { type : ["NodeType1", "NodeType2", "AnotherNodeType"]};
-
- //config.nodeCaption=function(n) {return n.name || n.title;};
- /* config.edgeCaption={"caption":["ACTED_IN","DIRECTED","PRODUCED","REVIEWED","WROTE"]}; */
- /* config.nodeMouseOver = function(n) {return n.id + "<br/>"+n.name || n.title;}; */
- /* config.nodeMouseOver = function(n) {return "test";}; */
-
-
- config.neo4jUrl="http://localhost:7474/db/data/cypher";
-
- alchemy = new Alchemy(config);
- alchemy.begin(config);
-
- var neo = new Neo(function() { return config.neo4jUrl; });
- var editor = createEditor();
-
- $("#execute").click(function(evt) {
- try {
- /* var allEdges = alchemy.get.edges().all();
- allEdges.forEach(function(edge){
- edge.remove();
- });
- var allNodes = alchemy.get.nodes().all();
- allNodes.forEach(function(node){
- node.remove();
- }); */
- evt.preventDefault();
- var query = editor.getValue();
- console.log("Executing Query",query);
- neo.executeQuery(query,{},function(err,res) {
- res = res || {}
- var graph=res.graph;
- var labels = res.labels;
- config.nodeTypes = {type: labels};
- if (err) {
- alchemy.conf.warningMessage=JSON.stringify(err);
- alchemy.startGraph(null);
- } else {
- alchemy.startGraph(graph);
- }
- });
- } catch(e) {
- console.log(e);
- }
- return false;
- });
-
- //new Cy2Neo(config,"graph","cypher","execute", function() { return $("#neo4jUrl").val(); });
- });
-
-
-
-</script>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/alchemyConfig.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/alchemyConfig.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/alchemyConfig.js
deleted file mode 100644
index a3c75f8..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/alchemyConfig.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var config = {
-
- /* cluster : true, */
-
- nodeCaption : "name",
- /* rootNodeRadius : 30, */
-
- /*showControlDash : true,
-
- showStats : true,
- nodeStats : true,
-
- showFilters : true,
- nodeFilters : true,*/
-
-/* captionToggle : true,
- edgesToggle : true,
- nodesToggle : true,*/
- toggleRootNotes : false,
-
- zoomControls : true,
-
- dataSource : {
- nodes : [],
- edges : []
- },
- forceLocked : false,
- alpha : 0.8,
- edgeTypes : "caption",
- directedEdges: true
-};
-
-// alchemy.begin(config)
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror-cypher.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror-cypher.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror-cypher.js
deleted file mode 100644
index 24f9d7a..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror-cypher.js
+++ /dev/null
@@ -1,190 +0,0 @@
-// Generated by CoffeeScript 1.6.3
-/*!
-Copyright (c) 2002-2014 "Neo Technology,"
-Network Engine for Objects in Lund AB [http://neotechnology.com]
-
-This file is part of Neo4j.
-
-Neo4j is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-
-(function() {
- var wordRegexp;
-
- wordRegexp = function(words) {
- return new RegExp("^(?:" + words.join("|") + ")$", "i");
- };
-
- CodeMirror.defineMode("cypher", function(config) {
- var curPunc, funcs, indentUnit, keywords, operatorChars, popContext, preds, pushContext, tokenBase, tokenLiteral;
- tokenBase = function(stream, state) {
- var ch, curPunc, type, word;
- ch = stream.next();
- curPunc = null;
- if (ch === "\"" || ch === "'") {
- stream.match(/.+?["']/);
- return "string";
- }
- if (/[{}\(\),\.;\[\]]/.test(ch)) {
- curPunc = ch;
- return "node";
- } else if (ch === "/" && stream.eat("/")) {
- stream.skipToEnd();
- return "comment";
- } else if (operatorChars.test(ch)) {
- stream.eatWhile(operatorChars);
- return null;
- } else {
- stream.eatWhile(/[_\w\d]/);
- if (stream.eat(":")) {
- stream.eatWhile(/[\w\d_\-]/);
- return "atom";
- }
- word = stream.current();
- type = void 0;
- if (funcs.test(word)) {
- return "builtin";
- }
- if (preds.test(word)) {
- return "def";
- } else if (keywords.test(word)) {
- return "keyword";
- } else {
- return "variable";
- }
- }
- };
- tokenLiteral = function(quote) {
- return function(stream, state) {
- var ch, escaped;
- escaped = false;
- ch = void 0;
- while ((ch = stream.next()) != null) {
- if (ch === quote && !escaped) {
- state.tokenize = tokenBase;
- break;
- }
- escaped = !escaped && ch === "\\";
- }
- return "string";
- };
- };
- pushContext = function(state, type, col) {
- return state.context = {
- prev: state.context,
- indent: state.indent,
- col: col,
- type: type
- };
- };
- popContext = function(state) {
- state.indent = state.context.indent;
- return state.context = state.context.prev;
- };
- indentUnit = config.indentUnit;
- curPunc = void 0;
- funcs = wordRegexp(["abs", "acos", "allShortestPaths", "asin", "atan", "atan2", "avg", "ceil", "coalesce", "collect", "cos", "cot", "count", "degrees", "e", "endnode", "exp", "extract", "filter", "floor", "haversin", "head", "id", "labels", "last", "left", "length", "log", "log10", "lower", "ltrim", "max", "min", "node", "nodes", "percentileCont", "percentileDisc", "pi", "radians", "rand", "range", "reduce", "rel", "relationship", "relationships", "replace", "right", "round", "rtrim", "shortestPath", "sign", "sin", "split", "sqrt", "startnode", "stdev", "stdevp", "str", "substring", "sum", "tail", "tan", "timestamp", "toFloat", "toInt", "trim", "type", "upper"]);
- preds = wordRegexp(["all", "and", "any", "has", "in", "none", "not", "or", "single", "xor"]);
- keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "distinct", "drop", "else", "end", "false", "foreach", "from", "headers", "in", "index", "is", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "remove", "return", "scan", "set", "skip", "start", "then", "true", "union", "unique", "using", "when", "where", "with"]);
- operatorChars = /[*+\-<>=&|~%^]/;
- return {
- startState: function(base) {
- return {
- tokenize: tokenBase,
- context: null,
- indent: 0,
- col: 0
- };
- },
- token: function(stream, state) {
- var style;
- if (stream.sol()) {
- if (state.context && (state.context.align == null)) {
- state.context.align = false;
- }
- state.indent = stream.indentation();
- }
- if (stream.eatSpace()) {
- return null;
- }
- style = state.tokenize(stream, state);
- if (style !== "comment" && state.context && (state.context.align == null) && state.context.type !== "pattern") {
- state.context.align = true;
- }
- if (curPunc === "(") {
- pushContext(state, ")", stream.column());
- } else if (curPunc === "[") {
- pushContext(state, "]", stream.column());
- } else if (curPunc === "{") {
- pushContext(state, "}", stream.column());
- } else if (/[\]\}\)]/.test(curPunc)) {
- while (state.context && state.context.type === "pattern") {
- popContext(state);
- }
- if (state.context && curPunc === state.context.type) {
- popContext(state);
- }
- } else if (curPunc === "." && state.context && state.context.type === "pattern") {
- popContext(state);
- } else if (/atom|string|variable/.test(style) && state.context) {
- if (/[\}\]]/.test(state.context.type)) {
- pushContext(state, "pattern", stream.column());
- } else if (state.context.type === "pattern" && !state.context.align) {
- state.context.align = true;
- state.context.col = stream.column();
- }
- }
- return style;
- },
- indent: function(state, textAfter) {
- var closing, context, firstChar;
- firstChar = textAfter && textAfter.charAt(0);
- context = state.context;
- if (/[\]\}]/.test(firstChar)) {
- while (context && context.type === "pattern") {
- context = context.prev;
- }
- }
- closing = context && firstChar === context.type;
- if (!context) {
- return 0;
- } else if (context.type === "keywords") {
- return newlineAndIndent;
- } else if (context.align) {
- return context.col + (closing ? 0 : 1);
- } else {
- return context.indent + (closing ? 0 : indentUnit);
- }
- }
- };
- });
-
- CodeMirror.modeExtensions["cypher"] = {
- autoFormatLineBreaks: function(text) {
- var i, lines, reProcessedPortion;
- lines = text.split("\n");
- reProcessedPortion = /\s+\b(return|where|order by|match|with|skip|limit|create|delete|set)\b\s/g;
- i = 0;
- while (i < lines.length) {
- lines[i] = lines[i].replace(reProcessedPortion, " \n$1 ").trim();
- i++;
- }
- return lines.join("\n");
- }
- };
-
- CodeMirror.defineMIME("application/x-cypher-query", "cypher");
-
-}).call(this);
[16/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Errors.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Errors.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Errors.java
deleted file mode 100644
index 960997d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Errors.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Errors extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String cls = request.getOptionalProperty(CLASS);
- final StringBuffer buffer = new StringBuffer();
- write(request, cls, buffer);
- if (buffer.length() > 0) {
- request.appendHtml("<div class=\"error\">");
- request.appendHtml(buffer.toString());
- request.appendHtml("</div>");
- }
- }
-
- public static void write(final Request request, String cls, final StringBuffer buffer) {
- if (cls == null) {
- cls = "error";
- }
- final String message = (String) request.getContext().getVariable("_error-message");
- if (message != null) {
- buffer.append(message);
- }
- final String details = (String) request.getContext().getVariable("_error-details");
- if (details != null) {
- buffer.append(details);
- }
-
- /*
- * final MessageBroker messageBroker = IsisContext.getMessageBroker();
- * final List<String> warnings = messageBroker.getWarnings(); for (final
- * String warning : warnings) { buffer.append("<div class=\"" + cls +
- * "\">" + warning + "</div>"); }
- */
- }
-
- @Override
- public String getName() {
- return "errors";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Feedback.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Feedback.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Feedback.java
deleted file mode 100644
index f734ce2..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Feedback.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Feedback extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String cls = request.getOptionalProperty(CLASS);
- final StringBuffer buffer = new StringBuffer();
- Errors.write(request, cls, buffer);
- Warnings.write(cls, buffer);
- Messages.write(cls, buffer);
- if (buffer.length() > 0) {
- request.appendHtml("<div class=\"feedback\">");
- request.appendHtml(buffer.toString());
- request.appendHtml("</div>");
- }
- }
-
- @Override
- public String getName() {
- return "feedback";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldLabel.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldLabel.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldLabel.java
deleted file mode 100644
index 32e2cd8..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldLabel.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class FieldLabel extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- public void process(final Request request) {
- final String id = request.getOptionalProperty(OBJECT);
- final String fieldName = request.getRequiredProperty(FIELD);
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
- if (field == null) {
- throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
- }
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
- String delimiter = request.getOptionalProperty("delimiter");
- if (delimiter == null) {
- delimiter = ": ";
- } else if (delimiter.equals("")) {
- delimiter = null;
- }
- write(request, field, delimiter);
- }
-
- @Override
- public String getName() {
- return "label";
- }
-
- public static void write(final Request content, final ObjectAssociation field, final String delimiter) {
- final String description = field.getDescription();
- final String titleSegment = description == null || description.equals("") ? null : ("title=\"" + description + "\"");
- content.appendHtml("<span class=\"label\"" + titleSegment + ">");
- content.appendAsHtmlEncoded(field.getName());
- if (delimiter != null) {
- content.appendHtml("<span class=\"delimiter\">" + delimiter + "</span>");
- }
- content.appendHtml("</span>");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldValue.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldValue.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldValue.java
deleted file mode 100644
index 3e84218..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldValue.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueFacet;
-import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
-
-public class FieldValue extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- public void process(final Request request) {
- final String className = request.getOptionalProperty(CLASS);
- final String id = request.getOptionalProperty(OBJECT);
- final String fieldName = request.getRequiredProperty(FIELD);
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
- if (field == null) {
- throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
- }
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
- final boolean isIconShowing = request.isRequested(SHOW_ICON, showIconByDefault());
- final int truncateTo = Integer.valueOf(request.getOptionalProperty(TRUNCATE, "0")).intValue();
-
- write(request, object, field, null, className, isIconShowing, truncateTo);
- }
-
- @Override
- public String getName() {
- return "field";
- }
-
- public static void write(final Request request, final ObjectAdapter object, final ObjectAssociation field, final LinkedObject linkedField, final String className, final boolean showIcon, final int truncateTo) {
-
- final ObjectAdapter fieldReference = field.get(object);
-
- if (fieldReference != null) {
- final String classSection = "class=\"" + (className == null ? "value" : className) + "\"";
- request.appendHtml("<span " + classSection + ">");
- if (field.isOneToOneAssociation()) {
- try {
- IsisContext.getPersistenceSession().resolveImmediately(fieldReference);
- } catch (final ObjectNotFoundException e) {
- request.appendHtml(e.getMessage() + "</span>");
- }
- }
-
- if (!field.getSpecification().containsFacet(ParseableFacet.class) && showIcon) {
- request.appendHtml("<img class=\"small-icon\" src=\"" + request.getContext().imagePath(fieldReference) + "\" alt=\"" + field.getSpecification().getShortIdentifier() + "\"/>");
- }
-
- if (linkedField != null) {
- final String id = request.getContext().mapObject(fieldReference, linkedField.getScope(), Scope.INTERACTION);
- request.appendHtml("<a href=\"" + linkedField.getForwardView() + "?" + linkedField.getVariable() + "=" + id + request.getContext().encodedInteractionParameters() + "\">");
- }
- String value = fieldReference == null ? "" : fieldReference.titleString();
- if (truncateTo > 0 && value.length() > truncateTo) {
- value = value.substring(0, truncateTo) + "...";
- }
-
- // TODO figure out a better way to determine if boolean or a
- // password
- final ObjectSpecification spec = field.getSpecification();
- final BooleanValueFacet facet = spec.getFacet(BooleanValueFacet.class);
- if (facet != null) {
- final boolean flag = facet.isSet(fieldReference);
- final String valueSegment = flag ? " checked=\"checked\"" : "";
- final String disabled = " disabled=\"disabled\"";
- request.appendHtml("<input type=\"checkbox\"" + valueSegment + disabled + " />");
- } else {
- request.appendAsHtmlEncoded(value);
- }
-
- if (linkedField != null) {
- request.appendHtml("</a>");
- }
- request.appendHtml("</span>");
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/GetField.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/GetField.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/GetField.java
deleted file mode 100644
index 8a6ab16..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/GetField.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.text.DecimalFormat;
-import java.text.Format;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.facets.value.date.DateValueFacet;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class GetField extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- public void process(final Request request) {
- final String id = request.getOptionalProperty(OBJECT);
- final String fieldName = request.getRequiredProperty(FIELD);
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
- if (object == null) {
- throw new ScimpiException("No object to get field for: " + fieldName + " - " + id);
- }
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
- if (field == null) {
- throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
- }
- final AuthenticationSession session = IsisContext.getAuthenticationSession();
- if (field.isVisible(session, object, where).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
-
- String pattern = request.getOptionalProperty("decimal-format");
- Format format = null;
- if (pattern != null) {
- format = new DecimalFormat(pattern);
- }
- pattern = request.getOptionalProperty("date-format");
- if (pattern != null) {
- format = new SimpleDateFormat(pattern);
- }
-
- final String name = request.getOptionalProperty(RESULT_NAME, fieldName);
- final String scopeName = request.getOptionalProperty(SCOPE);
- final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
-
- process(request, object, field, format, name, scope);
- }
-
- protected void process(final Request request, final ObjectAdapter object, final ObjectAssociation field, final Format format, final String name, final Scope scope) {
- final ObjectAdapter fieldReference = field.get(object);
- if (format != null && fieldReference.isValue()) {
- final DateValueFacet facet = fieldReference.getSpecification().getFacet(DateValueFacet.class);
- final Date date = facet.dateValue(fieldReference);
- final String value = format.format(date);
- request.appendDebug(" " + object + " -> " + value);
- request.getContext().addVariable(name, Request.getEncoder().encoder(value), scope);
- } else {
- final String source = fieldReference == null ? "" : request.getContext().mapObject(fieldReference, scope);
- request.appendDebug(" " + object + " -> " + source);
- request.getContext().addVariable(name, source, scope);
- }
- }
-
- @Override
- public String getName() {
- return "get-field";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/IncludeObject.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/IncludeObject.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/IncludeObject.java
deleted file mode 100644
index aa3bfff..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/IncludeObject.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-/**
- * Element to include another file that will display an object.
- */
-public class IncludeObject extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- public void process(final Request request) {
- final String path = request.getOptionalProperty("file");
- String id = request.getOptionalProperty(OBJECT);
- final String fieldName = request.getOptionalProperty(FIELD);
- ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
- if (fieldName != null) {
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
- object = field.get(object);
- id = request.getContext().mapObject(object, Scope.REQUEST);
- }
-
- if (object != null) {
- IsisContext.getPersistenceSession().resolveImmediately(object);
- request.getContext().addVariable("_object", id, Scope.REQUEST);
- importFile(request, path);
- }
- request.closeEmpty();
- }
-
- private static void importFile(final Request request, final String path) {
- // TODO load in file via HtmlFileParser
- final File file = new File(path);
- BufferedReader reader = null;
- try {
- if (file.exists()) {
- reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
- String line;
- while ((line = reader.readLine()) != null) {
- request.appendHtml(line);
- }
- } else {
- request.appendHtml("<P classs=\"error\">File " + path + " not found to import</P>");
- }
- } catch (final FileNotFoundException e) {
- throw new RuntimeException(e);
- } catch (final IOException e) {
- throw new RuntimeException(e);
- } finally {
- if (reader != null) {
- try {
- reader.close();
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
- }
-
- @Override
- public String getName() {
- return "include-object";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ListView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ListView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ListView.java
deleted file mode 100644
index 3bd8352..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ListView.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.util.Iterator;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
-
-public class ListView extends AbstractObjectProcessor {
-
- @Override
- public String checkFieldType(final ObjectAssociation objectField) {
- return objectField.isOneToManyAssociation() ? null : "is not a collection";
- }
-
- @Override
- public void process(final Request request, final ObjectAdapter object) {
- final String linkRowView = request.getOptionalProperty(LINK_VIEW);
- final String linkObjectName = request.getOptionalProperty(ELEMENT_NAME, RequestContext.RESULT);
- final String linkObjectScope = request.getOptionalProperty(SCOPE, Scope.INTERACTION.toString());
- LinkedObject linkedRow = null;
- if (linkRowView != null) {
- linkedRow = new LinkedObject(linkObjectName, linkObjectScope, request.getContext().fullUriPath(linkRowView));
- }
- final String bulletType = request.getOptionalProperty("type");
- write(request, object, linkedRow, bulletType);
- }
-
- public static void write(final Request request, final ObjectAdapter collection, final LinkedObject linkRow, final String bulletType) {
-
- if (bulletType == null) {
- request.appendHtml("<ol>");
- } else {
- request.appendHtml("<ul type=\"" + bulletType + "\">");
- }
-
- final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
- final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
- while (iterator.hasNext()) {
- final ObjectAdapter element = iterator.next();
-
- request.appendHtml("<li>");
- if (linkRow != null) {
- final Scope scope = linkRow == null ? Scope.INTERACTION : RequestContext.scope(linkRow.getScope());
- RequestContext context = request.getContext();
- final String rowId = context.mapObject(element, scope);
- request.appendHtml("<a class=\"item-select\" href=\"" + linkRow.getForwardView() + "?" + linkRow.getVariable()
- + "=" + rowId + context.encodedInteractionParameters() + "\">");
- }
- request.appendAsHtmlEncoded(element.titleString());
- if (linkRow != null) {
- request.appendHtml("</a>");
- }
-
- request.appendHtml("</li>\n");
- }
- if (bulletType == null) {
- request.appendHtml("</ol>");
- } else {
- request.appendHtml("</ul>");
- }
-
- }
-
- @Override
- public String getName() {
- return "list";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
deleted file mode 100644
index 1efad45..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.util.List;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableView.SimpleTableBuilder;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
-
-public class LongFormView extends AbstractFormView {
-
- @Override
- protected void addField(final Request request, final ObjectAdapter object, final ObjectAssociation field, final LinkedObject linkedObject, final boolean showIcons) {
- if (field.isOneToManyAssociation()) {
- final String noColumnsString = request.getOptionalProperty("no-columns", "3");
- final String tableClass = request.getOptionalProperty("table-class");
- final String rowClassesList = request.getOptionalProperty("row-classes", ODD_ROW_CLASS + "|" + EVEN_ROW_CLASS);
- String[] rowClasses = new String[0];
- if (rowClassesList != null) {
- rowClasses = rowClassesList.split("[,|/]");
- }
- int noColumns;
- ResolveFieldUtil.resolveField(object, field);
- final ObjectAdapter collection = field.get(object);
- final ObjectSpecification elementSpec = collection.getElementSpecification();
- final List<ObjectAssociation> fields = elementSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);
- if (noColumnsString.equalsIgnoreCase("all")) {
- noColumns = fields.size();
- } else {
- noColumns = Math.min(fields.size(), Integer.valueOf(noColumnsString));
- }
- // final boolean isFieldEditable = field.isUsable(IsisContext.getAuthenticationSession(), object).isAllowed();
- final String summary = "Table of elements in " + field.getName();
- // TableView.write(request, summary, object, field, collection, noColumns, fields, isFieldEditable, showIconByDefault(), tableClass, rowClasses, linkedObject);
-
-
- final String headers[] = new String[fields.size()];
- int h = 0;
- for (int i = 0; i < noColumns; i++) {
- if (fields.get(i).isOneToManyAssociation()) {
- continue;
- }
- headers[h++] = fields.get(i).getName();
- }
-
- final LinkedObject[] linkedFields = new LinkedObject[fields.size()];
-
-
- final TableContentWriter rowBuilder =new SimpleTableBuilder(object.titleString(), true, false, "", noColumns, headers, fields, false,
- showIcons, false, false, false, field.getName(), linkedFields, null);
- TableView.write(request, collection, summary, rowBuilder, null, tableClass, rowClasses);
- } else {
- super.addField(request, object, field, linkedObject, showIcons);
- }
- }
-
- @Override
- public String getName() {
- return "long-form";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Messages.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Messages.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Messages.java
deleted file mode 100644
index 8ec1420..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Messages.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.util.List;
-import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Messages extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String cls = request.getOptionalProperty(CLASS);
- final StringBuffer buffer = new StringBuffer();
- write(cls, buffer);
- if (buffer.length() > 0) {
- request.appendHtml("<div class=\"feedback\">");
- request.appendHtml(buffer.toString());
- request.appendHtml("</div>");
- }
-
- }
-
- public static void write(String cls, final StringBuffer buffer) {
- if (cls == null) {
- cls = "message";
- }
- final MessageBroker messageBroker = IsisContext.getMessageBroker();
- final List<String> messages = messageBroker.getMessages();
- for (final String message : messages) {
- buffer.append("<div class=\"" + cls + "\">" + message + "</div>");
- }
- }
-
- @Override
- public String getName() {
- return "messages";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/SelectedObject.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/SelectedObject.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/SelectedObject.java
deleted file mode 100644
index 7af46ab..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/SelectedObject.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-/**
- * <swf:selected name="selected" object="${action}" equals="${subaction}" />
- */
-public class SelectedObject extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String name = request.getOptionalProperty(NAME, "selected");
- final String objectId = request.getRequiredProperty(OBJECT);
- final String equalsId = request.getOptionalProperty("equals");
- final String title = request.getOptionalProperty(BUTTON_TITLE);
-
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(objectId);
- final ObjectAdapter other = request.getContext().getMappedObjectOrResult(equalsId);
- if (object == other || object.equals(title)) {
- // TODO title is not being used!
- request.getContext().addVariable(ID, " id=\"" + name + "\" ", Scope.INTERACTION);
- } else {
- request.getContext().addVariable(ID, "", Scope.INTERACTION);
- }
- request.closeEmpty();
- }
-
- @Override
- public String getName() {
- return "selected";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ShortFormView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ShortFormView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ShortFormView.java
deleted file mode 100644
index 31e903b..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ShortFormView.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-
-public class ShortFormView extends AbstractFormView {
-
- @Override
- protected boolean ignoreField(final ObjectAssociation field) {
- return field.isOneToManyAssociation();
- }
-
- @Override
- public String getName() {
- return "short-form";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBlock.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBlock.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBlock.java
deleted file mode 100644
index 2927fab..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBlock.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
-
-public class TableBlock implements BlockContent {
-
- // {{ collection
- private ObjectAdapter collection;
-
- public void setCollection(final ObjectAdapter collection) {
- this.collection = collection;
- }
-
- public ObjectAdapter getCollection() {
- return collection;
- }
- // }}
-
- // {{ linkView
- private String linkView;
-
- public String getlinkView() {
- return linkView;
- }
-
- public void setlinkView(final String linkView) {
- this.linkView = linkView;
- }
- // }}
-
- // {{ linkName
- private String linkName;
-
- public String getlinkName() {
- return linkName;
- }
-
- public void setlinkName(final String linkName) {
- this.linkName = linkName;
- }
- // }}
-
- // {{ elementName
- private String elementName;
-
- public String getElementName() {
- return elementName;
- }
-
- public void setElementName(final String linkObject) {
- this.elementName = linkObject;
- }
- // }}
-
- private RepeatMarker marker;
-
- public RepeatMarker getMarker() {
- return marker;
- }
-
- public void setMarker(final RepeatMarker marker) {
- this.marker = marker;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBuilder.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBuilder.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBuilder.java
deleted file mode 100644
index e726e29..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBuilder.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.PageWriter;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
-
-public class TableBuilder extends AbstractTableView {
-
- @Override
- protected TableContentWriter createRowBuilder(final Request request, final RequestContext context, final String parent, final List<ObjectAssociation> allFields, final ObjectAdapter collection) {
-
- final String title = request.getOptionalProperty(TABLE_TITLE);
- final String variable = request.getOptionalProperty(ELEMENT_NAME, ELEMENT);
- final String headerClass = request.getOptionalProperty("head-" + CLASS);
-
- final TableBlock block = new TableBlock();
- block.setCollection(collection);
- block.setElementName(variable);
- request.setBlockContent(block);
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String headers = request.popBuffer();
- return new TableContentWriter() {
-
- @Override
- public void writeFooters(final PageWriter writer) {
- }
-
- public void tidyUp() {
- request.popBlockContent();
- }
-
- @Override
- public void writeCaption(PageWriter writer) {
- if (title != null) {
- writer.appendHtml("<caption>");
- writer.appendHtml(title);
- writer.appendHtml("</thead>");
- }
- }
-
- @Override
- public void writeHeaders(final PageWriter writer) {
- final String headerSegment = headerClass == null ? "" : (" class=\"" + headerClass + "\"");
- writer.appendHtml("<thead" + headerSegment + ">");
- writer.appendHtml(headers);
- writer.appendHtml("</thead>");
- }
-
- @Override
- public void writeElement(final Request request, final RequestContext context, final ObjectAdapter element) {
- context.addVariable(variable, context.mapObject(element, Scope.REQUEST), Scope.REQUEST);
- final RepeatMarker end = request.createMarker();
- final RepeatMarker marker = block.getMarker();
- marker.repeat();
- request.processUtilCloseTag();
- end.repeat();
- }
- };
- }
-
- @Override
- public String getName() {
- return "table-builder";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableCell.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableCell.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableCell.java
deleted file mode 100644
index 3f99218..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableCell.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class TableCell extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ALL_TABLES) or @Disabled(where=Where.ALL_TABLES) will indeed
- // be hidden from all tables but will be visible/enabled (perhaps incorrectly)
- // if annotated with Where.PARENTED_TABLE or Where.STANDALONE_TABLE
- private final Where where = Where.ALL_TABLES;
-
- @Override
- public void process(final Request request) {
- final TableBlock tableBlock = (TableBlock) request.getBlockContent();
- final String id = request.getOptionalProperty(OBJECT);
- final String fieldName = request.getRequiredProperty(FIELD);
- final String linkView = request.getOptionalProperty(LINK_VIEW);
- String className = request.getOptionalProperty(CLASS);
- className = className == null ? "" : " class=\"" + className + "\"";
- RequestContext context = request.getContext();
- final ObjectAdapter object = context.getMappedObjectOrVariable(id, tableBlock.getElementName());
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
- if (field == null) {
- throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
- }
- request.appendHtml("<td" + className + ">");
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed()) {
- final ObjectAdapter fieldReference = field.get(object);
- final String source = fieldReference == null ? "" : context.mapObject(fieldReference, Scope.REQUEST);
- final String name = request.getOptionalProperty(RESULT_NAME, fieldName);
- context.addVariable(name, Request.getEncoder().encoder(source), Scope.REQUEST);
-
- if (linkView != null) {
- final String linkId = context.mapObject(object, Scope.REQUEST);
- final String linkName = request.getOptionalProperty(LINK_NAME, RequestContext.RESULT);
- final String linkObject = request.getOptionalProperty(LINK_OBJECT, linkId);
- request.appendHtml("<a href=\"" + linkView + "?" + linkName + "=" + linkObject + context.encodedInteractionParameters() + "\">");
- } else if(tableBlock.getlinkView() != null) {
- String linkObjectInVariable = tableBlock.getElementName();
- final String linkId = (String) context.getVariable(linkObjectInVariable);
- request.appendHtml("<a href=\"" + tableBlock.getlinkView() + "?" + tableBlock.getlinkName() + "=" + linkId + context.encodedInteractionParameters() + "\">");
- }
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String buffer = request.popBuffer();
- if (buffer.trim().length() == 0) {
- request.appendAsHtmlEncoded(fieldReference == null ? "" : fieldReference.titleString());
- } else {
- request.appendHtml(buffer);
- }
- if (linkView != null) {
- request.appendHtml("</a>");
- }
- } else {
- request.skipUntilClose();
- }
- request.appendHtml("</td>");
- }
-
- @Override
- public String getName() {
- return "table-cell";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableContentWriter.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableContentWriter.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableContentWriter.java
deleted file mode 100644
index 10da109..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableContentWriter.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.PageWriter;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public interface TableContentWriter {
-
- void writeCaption(PageWriter writer);
-
- void writeHeaders(PageWriter writer);
-
- void writeFooters(PageWriter writer);
-
- void writeElement(Request request, RequestContext context, ObjectAdapter element);
-
- void tidyUp();
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableEmpty.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableEmpty.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableEmpty.java
deleted file mode 100644
index 5595207..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableEmpty.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class TableEmpty extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final TableBlock tableBlock = (TableBlock) request.getBlockContent();
- final ObjectAdapter collection = tableBlock.getCollection();
- final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
- if (facet.size(collection) == 0) {
- String className = request.getOptionalProperty(CLASS);
- className = className == null ? "" : " class=\"" + className + "\"";
- request.appendHtml("<tr" + className + ">");
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String buffer = request.popBuffer();
- request.appendHtml(buffer);
- request.appendHtml("</td>");
- } else {
- request.skipUntilClose();
- }
- }
-
- @Override
- public String getName() {
- return "table-empty";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableHeader.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableHeader.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableHeader.java
deleted file mode 100644
index ff04389..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableHeader.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class TableHeader extends AbstractElementProcessor {
-
- @Override
- public String getName() {
- return "table-header";
- }
-
- @Override
- public void process(final Request request) {
- request.appendHtml("<thead><tr>");
- request.processUtilCloseTag();
- request.appendHtml("</tr></thead>");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableRow.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableRow.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableRow.java
deleted file mode 100644
index eb92656..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableRow.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
-
-public class TableRow extends AbstractElementProcessor {
-
- @Override
- public String getName() {
- return "table-row";
- }
-
- @Override
- public void process(final Request request) {
- final TableBlock block = (TableBlock) request.getBlockContent();
-
- final RepeatMarker start = request.createMarker();
- block.setMarker(start);
-
- final String linkView = request.getOptionalProperty(LINK_VIEW);
- if (linkView != null) {
- block.setlinkView(linkView);
- block.setlinkName(request.getOptionalProperty(LINK_NAME, RequestContext.RESULT));
- }
-
- request.skipUntilClose();
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableView.java
deleted file mode 100644
index caf984f..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableView.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.PageWriter;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedFieldsBlock;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.RemoveElement;
-
-public class TableView extends AbstractTableView {
-
- static final class SimpleTableBuilder implements TableContentWriter {
- private final String parent;
- private final boolean includeHeader;
- private final boolean includeFooter;
- private final String title;
- private final String[] headers;
- private final List<ObjectAssociation> fields;
- private final boolean showTitle;
- private final boolean showIcons;
- private final boolean showSelectOption;
- private final boolean showDeleteOption;
- private final boolean showEditOption;
- private final String fieldName;
- private final LinkedObject[] linkedFields;
- private final LinkedObject linkRow;
- private final int noColumns;
-
- SimpleTableBuilder(
- final String parent,
- final boolean includeHeader,
- final boolean includeFooter,
- final String title,
- final int noColumns,
- final String[] headers,
- final List<ObjectAssociation> fields,
- final boolean showTitle,
- final boolean showIcons,
- final boolean showSelectOption,
- final boolean showDeleteOption,
- final boolean showEditOption,
- final String fieldName,
- final LinkedObject[] linkedFields,
- final LinkedObject linkRow) {
- this.parent = parent;
- this.includeHeader = includeHeader;
- this.includeFooter = includeFooter;
- this.title = title;
- this.showTitle = showTitle;
- this.noColumns = noColumns < 1 ? fields.size() : noColumns;
- this.headers = headers;
- this.fields = fields;
- this.showIcons = showIcons;
- this.showSelectOption = showSelectOption;
- this.showDeleteOption = showDeleteOption;
- this.showEditOption = showEditOption;
- this.fieldName = fieldName;
- this.linkedFields = linkedFields;
- this.linkRow = linkRow;
- }
-
- @Override
- public void writeFooters(final PageWriter writer) {
- if (includeFooter) {
- writer.appendHtml("<tfoot>");
- columnHeaders(writer, headers);
- writer.appendHtml("</tfoot>");
- }
- }
-
- @Override
- public void writeCaption(PageWriter writer) {
- if (title != null) {
- writer.appendHtml("<caption>");
- writer.appendHtml(title);
- writer.appendHtml("</caption>");
- }
- }
-
- @Override
- public void writeHeaders(final PageWriter writer) {
- if (includeHeader) {
- writer.appendHtml("<thead>");
- columnHeaders(writer, headers);
- writer.appendHtml("</thead>");
- }
- }
-
- private void columnHeaders(final PageWriter writer, final String[] headers) {
- writer.appendHtml("<tr class=\"column-headers\">");
- if (showTitle) {
- writer.appendHtml("<th></th>");
- }
- final String[] columnHeaders = headers;
- for (final String columnHeader : columnHeaders) {
- if (columnHeader != null) {
- writer.appendHtml("<th>");
- writer.appendAsHtmlEncoded(columnHeader);
- writer.appendHtml("</th>");
- }
- }
- writer.appendHtml("<th class=\"controls\"></th>");
- writer.appendHtml("</tr>");
- }
-
- public void tidyUp() {
- // request.popBlockContent();
-
- // Is it the block that is left over, or is the collection form not being closed?
- }
-
- @Override
- public void writeElement(final Request request, final RequestContext context, final ObjectAdapter element) {
- final String rowId = context.mapObject(element, Scope.INTERACTION);
- final String scope = linkRow == null ? "" : "&" + SCOPE + "=" + linkRow.getScope();
- String result = "";
- result = context.encodedInteractionParameters();
-
- if (noColumns == 0) {
- request.appendHtml("<td>");
- if (linkRow != null) {
- request.appendHtml("<td><a href=\"" + linkRow.getForwardView() + "?" + linkRow.getVariable() + "=" + rowId + result + scope + "\">");
- request.appendAsHtmlEncoded(element.titleString());
- request.appendHtml("</a>");
- } else {
- request.appendAsHtmlEncoded(element.titleString());
- }
- request.appendHtml("</td>");
-
- } else {
- if (showTitle) {
- request.appendHtml("<td>");
- request.appendAsHtmlEncoded(element.titleString());
- request.appendHtml("</td>");
- }
-
- for (int i = 0; i < noColumns; i++) {
- if (fields.get(i).isOneToManyAssociation()) {
- continue;
- }
- request.appendHtml("<td>");
- final ObjectAdapter field = fields.get(i).get(element);
- if (field != null) {
- if (showIcons && !fields.get(i).getSpecification().containsFacet(ParseableFacet.class)) {
- request.appendHtml("<img class=\"" + "small-icon" + "\" src=\"" + request.getContext().imagePath(field) + "\" alt=\"" + fields.get(i).getSpecification().getShortIdentifier() + "\"/>");
- }
- if (linkRow != null) {
- request.appendHtml("<a href=\"" + linkRow.getForwardView() + "?" + linkRow.getVariable() + "=" + rowId + result + scope + "\">");
- } else if (linkedFields[i] != null) {
- final ObjectAdapter fieldObject = fields.get(i).get(element);
- final String id = context.mapObject(fieldObject, Scope.INTERACTION);
- request.appendHtml("<a href=\"" + linkedFields[i].getForwardView() + "?" + linkedFields[i].getVariable() + "=" + id + "\">");
- context.mapObject(fieldObject, RequestContext.scope(linkedFields[i].getScope()));
-
- }
- try {
- request.appendAsHtmlEncoded(field.titleString());
- } catch (final ObjectNotFoundException e) {
- request.appendAsHtmlEncoded(e.getMessage());
- }
- if (linkRow != null || linkedFields[i] != null) {
- request.appendHtml("</a>");
- }
- }
- request.appendHtml("</td>");
-
- }
- }
- request.appendHtml("<td class=\"controls\">");
- if (showSelectOption) {
- request.appendHtml("<a class=\"button element-select\" href=\"" + "_generic." + Dispatcher.EXTENSION + "?" + RequestContext.RESULT + "=" + rowId + result + scope + "\">view</a>");
- }
- if (showEditOption) {
- request.appendHtml(" <a class=\"button element-edit\" href=\"" + "_generic_edit." + Dispatcher.EXTENSION + "?" + RequestContext.RESULT + "=" + rowId + result + scope + "\">edit</a>");
- }
-
- if (showDeleteOption && parent != null) {
- String view = request.getViewPath();
- view = context.fullFilePath(view == null ? context.getResourceFile() : view);
- RemoveElement.write(request, context.getMappedObject(parent), fieldName, element, null, view, view, "delete", "action in-line element-delete confirm");
- }
-
- request.appendHtml("</td>");
-
- }
- }
-
- @Override
- protected TableContentWriter createRowBuilder(
- final Request request,
- final RequestContext context,
- final String parent,
- final List<ObjectAssociation> allFields,
- final ObjectAdapter collection) {
- final String fieldName = request.getOptionalProperty(FIELD);
- final String title = request.getOptionalProperty(FORM_TITLE);
- return rowBuilder(request, context, title, parent, fieldName, allFields, showIconByDefault());
- }
-
- private static TableContentWriter rowBuilder(
- final Request request,
- final RequestContext context,
- final String title,
- final String object,
- final String fieldName,
- final List<ObjectAssociation> allFields,
- final boolean showIconByDefault) {
- final String linkRowView = request.getOptionalProperty(LINK_VIEW);
- final String linkObjectName = request.getOptionalProperty(ELEMENT_NAME, RequestContext.RESULT);
- final String linkObjectScope = request.getOptionalProperty(SCOPE, Scope.INTERACTION.toString());
- final LinkedObject linkRow = linkRowView == null ? null : new LinkedObject(linkObjectName, linkObjectScope, context.fullUriPath(linkRowView));
- final boolean includeHeader = request.isRequested(HEADER, true);
- final boolean includeFooter = request.isRequested(FOOTER, false);
-
- final boolean linkFields = request.isRequested("link-fields", true);
- final boolean showTitle = request.isRequested(SHOW_TITLE, false);
- final boolean showIcons = request.isRequested(SHOW_ICON, showIconByDefault);
- final boolean showSelectOption = request.isRequested(SHOW_SELECT, true);
- final boolean showEditOption = request.isRequested(SHOW_EDIT, true);
- final boolean showDeleteOption = request.isRequested(SHOW_DELETE, true);
-
- final String noColumnsString = request.getOptionalProperty("no-columns", "3");
-
- final LinkedFieldsBlock block = new LinkedFieldsBlock();
- request.setBlockContent(block);
- request.processUtilCloseTag();
- final List<ObjectAssociation> fields = block.includedFields(allFields);
- final LinkedObject[] linkedFields = block.linkedFields(fields);
- for (int i = 0; i < linkedFields.length; i++) {
- if (linkedFields[i] == null && linkFields && !fields.get(i).getSpecification().containsFacet(ParseableFacet.class)) {
- linkedFields[i] = new LinkedObject("_generic.shtml");
- }
- if (linkedFields[i] != null) {
- linkedFields[i].setForwardView(context.fullUriPath(linkedFields[i].getForwardView()));
- }
- }
-
- int noColumns;
- if (noColumnsString.equalsIgnoreCase("all")) {
- noColumns = fields.size();
- } else {
- noColumns = Math.min(fields.size(), Integer.valueOf(noColumnsString));
- }
-
- final String headers[] = new String[noColumns];
- int h = 0;
- for (int i = 0; i < noColumns; i++) {
- if (fields.get(i).isOneToManyAssociation()) {
- continue;
- }
- headers[h++] = fields.get(i).getName();
- }
-
- request.popBlockContent();
-
- return new SimpleTableBuilder(object, includeHeader, includeFooter, title, noColumns, headers, fields, showTitle,
- showIcons, showSelectOption, showDeleteOption, showEditOption, fieldName, linkedFields, linkRow);
- }
-
- public static void write(
- final Request request,
- final String summary,
- final ObjectAdapter object,
- final ObjectAssociation field,
- final ObjectAdapter collection,
- final int noColumns,
- final List<ObjectAssociation> fields,
- final boolean linkAllFields,
- final boolean showIconByDefault,
- final String tableClass,
- final String[] rowClasses,
- LinkedObject linkedObject) {
- final LinkedObject[] linkedFields = new LinkedObject[fields.size()];
- if (linkAllFields) {
- for (int i = 0; i < linkedFields.length; i++) {
- if (fields.get(i).isOneToOneAssociation()) {
- linkedFields[i] = linkedObject == null ? new LinkedObject("_generic.shtml") : linkedObject;
- }
- }
- }
-
- final String headers[] = new String[fields.size()];
- int h = 0;
- for (int i = 0; i < fields.size(); i++) {
- if (fields.get(i).isOneToManyAssociation()) {
- continue;
- }
- headers[h++] = fields.get(i).getName();
- }
-
- final RequestContext context = request.getContext();
- final TableContentWriter rowBuilder = rowBuilder(request, context, null, context.mapObject(object, Scope.REQUEST), field.getIdentifier().getMemberName(), fields,
- showIconByDefault);
- write(request, collection, summary, rowBuilder, null, null, null);
- }
-
- @Override
- public String getName() {
- return "table";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Title.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Title.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Title.java
deleted file mode 100644
index d3b6904..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Title.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-public class Title extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String id = request.getOptionalProperty(OBJECT);
- final String fieldName = request.getOptionalProperty(FIELD);
- final int truncateTo = Integer.valueOf(request.getOptionalProperty(TRUNCATE, "0")).intValue();
- final boolean isIconShowing = request.isRequested(SHOW_ICON, showIconByDefault());
- String className = request.getOptionalProperty(CLASS);
- className = className == null ? "title-icon" : className;
- ObjectAdapter object = MethodsUtils.findObject(request.getContext(), id);
- if (fieldName != null) {
- final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
- object = field.get(object);
- }
-
- if (object != null) {
- request.appendHtml("<span class=\"object\">");
- IsisContext.getPersistenceSession().resolveImmediately(object);
- if (isIconShowing) {
- final String iconPath = request.getContext().imagePath(object);
- request.appendHtml("<img class=\"" + className + "\" src=\"" + iconPath + "\" />");
- }
- request.appendTruncated(object.titleString(), truncateTo);
- request.appendHtml("</span>");
- }
- request.closeEmpty();
- }
-
- @Override
- public String getName() {
- return "title";
- }
-
-}
[24/59] [abbrv] isis git commit: ISIS-789: updates to simpleapp.
Posted by da...@apache.org.
ISIS-789: updates to simpleapp.
Have unstaged some hunks that are obsolete (eg i18n facet decorator)
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/859a1350
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/859a1350
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/859a1350
Branch: refs/heads/ISIS-789
Commit: 859a1350ed1c14c131f2959717c524141f65fb20
Parents: 30a4cb6
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Mar 30 15:01:52 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Mar 30 15:01:52 2015 +0100
----------------------------------------------------------------------
example/application/simpleapp/.gitignore | 1 +
example/application/simpleapp/dom/pom.xml | 2 +-
example/application/simpleapp/pom.xml | 7 ++++---
example/application/simpleapp/webapp/pom.xml | 19 ++++++++++---------
.../WEB-INF/persistor_datanucleus.properties | 10 +++++-----
.../resources/archetype-resources/dom/pom.xml | 2 +-
.../main/resources/archetype-resources/pom.xml | 7 ++++---
7 files changed, 26 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/859a1350/example/application/simpleapp/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/.gitignore b/example/application/simpleapp/.gitignore
index 2e2f988..0558e54 100644
--- a/example/application/simpleapp/.gitignore
+++ b/example/application/simpleapp/.gitignore
@@ -39,3 +39,4 @@ JArchitectOut/
rebel.xml
+/translations.pot
http://git-wip-us.apache.org/repos/asf/isis/blob/859a1350/example/application/simpleapp/dom/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/pom.xml b/example/application/simpleapp/dom/pom.xml
index 11de021..7d159cf 100644
--- a/example/application/simpleapp/dom/pom.xml
+++ b/example/application/simpleapp/dom/pom.xml
@@ -86,7 +86,7 @@
datanucleus-maven-plugin
</artifactId>
<versionRange>
- [3.2.0-release,)
+ [4.0.0-release,)
</versionRange>
<goals>
<goal>enhance</goal>
http://git-wip-us.apache.org/repos/asf/isis/blob/859a1350/example/application/simpleapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/pom.xml b/example/application/simpleapp/pom.xml
index 5fad93e..25e735e 100644
--- a/example/application/simpleapp/pom.xml
+++ b/example/application/simpleapp/pom.xml
@@ -37,9 +37,10 @@
<isis.version>1.9.0-SNAPSHOT</isis.version>
<!-- must be consistent with the versions defined by the JDO Objectstore -->
- <datanucleus-accessplatform-jdo-rdbms.version>3.3.6</datanucleus-accessplatform-jdo-rdbms.version>
- <datanucleus-maven-plugin.version>3.3.2</datanucleus-maven-plugin.version>
-
+ <datanucleus-accessplatform-jdo-rdbms.version>4.0.4</datanucleus-accessplatform-jdo-rdbms.version>
+ <datanucleus-jodatime.version>4.0.4</datanucleus-jodatime.version>
+ <datanucleus-maven-plugin.version>4.0.0-release</datanucleus-maven-plugin.version>
+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
http://git-wip-us.apache.org/repos/asf/isis/blob/859a1350/example/application/simpleapp/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/pom.xml b/example/application/simpleapp/webapp/pom.xml
index 5125558..1b7eac0 100644
--- a/example/application/simpleapp/webapp/pom.xml
+++ b/example/application/simpleapp/webapp/pom.xml
@@ -16,7 +16,8 @@
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
---><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/maven-v4_0_0.xsd">
+-->
+<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
@@ -349,14 +350,14 @@
</build>
</profile>
<profile>
- <id>neo4j</id>
- <dependencies>
- <dependency>
- <groupId>org.datanucleus</groupId>
- <artifactId>datanucleus-neo4j</artifactId>
- <version>3.2.3</version>
- </dependency>
- </dependencies>
+ <id>neo4j</id>
+ <dependencies>
+ <dependency>
+ <groupId>org.datanucleus</groupId>
+ <artifactId>datanucleus-neo4j</artifactId>
+ <version>4.0.4</version>
+ </dependency>
+ </dependencies>
</profile>
</profiles>
http://git-wip-us.apache.org/repos/asf/isis/blob/859a1350/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
index 6f3aae6c..638a6c7 100644
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
@@ -44,9 +44,10 @@ isis.persistor.datanucleus.RegisterEntities.packagePrefix=domainapp.dom.modules
#
#####################################################################
-isis.persistor.datanucleus.impl.datanucleus.autoCreateSchema=true
-isis.persistor.datanucleus.impl.datanucleus.validateTables=true
-isis.persistor.datanucleus.impl.datanucleus.validateConstraints=true
+isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateTables=false
+isis.persistor.datanucleus.impl.datanucleus.schema.validateConstraints=true
+#isis.persistor.datanucleus.impl.datanucleus.mapping.Schema="simple"
#
@@ -60,8 +61,7 @@ isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=fa
# How column names are identified
# (http://www.datanucleus.org/products/datanucleus/jdo/orm/datastore_identifiers.html)
#
-isis.persistor.datanucleus.impl.datanucleus.identifier.case=PreserveCase
-
+isis.persistor.datanucleus.impl.datanucleus.identifier.case=MixedCase
#
# L2 cache
http://git-wip-us.apache.org/repos/asf/isis/blob/859a1350/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/pom.xml
----------------------------------------------------------------------
diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/pom.xml b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/pom.xml
index 5eef061..79bc279 100644
--- a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/pom.xml
+++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/pom.xml
@@ -78,7 +78,7 @@
<pluginExecutionFilter>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-maven-plugin</artifactId>
- <versionRange>[3.2.0-release,)</versionRange>
+ <versionRange>[4.0.0-release,)</versionRange>
<goals>
<goal>enhance</goal>
</goals>
http://git-wip-us.apache.org/repos/asf/isis/blob/859a1350/example/archetype/simpleapp/src/main/resources/archetype-resources/pom.xml
----------------------------------------------------------------------
diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/pom.xml b/example/archetype/simpleapp/src/main/resources/archetype-resources/pom.xml
index a5569c2..a0d5f6e 100644
--- a/example/archetype/simpleapp/src/main/resources/archetype-resources/pom.xml
+++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/pom.xml
@@ -35,9 +35,10 @@
<isis.version>1.9.0-SNAPSHOT</isis.version>
<!-- must be consistent with the versions defined by the JDO Objectstore -->
- <datanucleus-accessplatform-jdo-rdbms.version>3.3.6</datanucleus-accessplatform-jdo-rdbms.version>
- <datanucleus-maven-plugin.version>3.3.2</datanucleus-maven-plugin.version>
-
+ <datanucleus-accessplatform-jdo-rdbms.version>4.0.4</datanucleus-accessplatform-jdo-rdbms.version>
+ <datanucleus-jodatime.version>4.0.4</datanucleus-jodatime.version>
+ <datanucleus-maven-plugin.version>4.0.0-release</datanucleus-maven-plugin.version>
+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
[49/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.js b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.js
deleted file mode 100644
index b09e097..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.js
+++ /dev/null
@@ -1,3153 +0,0 @@
-(function() {
- "Alchemy.js is a graph drawing application for the web.\nCopyright (C) 2014 GraphAlchemist, Inc.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\nlets";
- var Alchemy, Clustering, DrawEdge, DrawEdges, DrawNode, DrawNodes, Editor, EditorInteractions, EditorUtils, Layout, root, warnings,
- __slice = [].slice,
- __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
-
- Alchemy = (function() {
- function Alchemy(userConf) {
- if (userConf == null) {
- userConf = null;
- }
- this.a = this;
- this.version = "0.4.1";
- this.get = new this.Get(this);
- this.remove = new this.Remove(this);
- this.create = new this.Create(this);
- this.set = new this.Set(this);
- this.drawing = {
- DrawEdge: DrawEdge(this),
- DrawEdges: DrawEdges(this),
- DrawNode: DrawNode(this),
- DrawNodes: DrawNodes(this),
- EdgeUtils: this.EdgeUtils(this),
- NodeUtils: this.NodeUtils(this)
- };
- this.controlDash = this.controlDash(this);
- this.stats = this.stats(this);
- this.layout = Layout;
- this.clustering = Clustering;
- this.models = {
- Node: this.Node(this),
- Edge: this.Edge(this)
- };
- this.utils = {
- warnings: new warnings(this)
- };
- this.filters = this.filters(this);
- this.exports = this.exports(this);
- this.visControls = {};
- this.styles = {};
- this.editor = {};
- this.log = {};
- this.state = {
- "interactions": "default",
- "layout": "default"
- };
- this.startGraph = this.startGraph(this);
- this.updateGraph = this.updateGraph(this);
- this.generateLayout = this.generateLayout(this);
- this.svgStyles = this.svgStyles(this);
- this.interactions = this.interactions(this);
- this.search = this.search(this);
- this.plugins = this.plugins(this);
- this._nodes = {};
- this._edges = {};
- this.getNodes = this.get.getNodes;
- this.getEdges = this.get.getEdges;
- this.allNodes = this.get.allNodes;
- this.allEdges = this.get.allEdges;
- if (userConf) {
- this.begin(userConf);
- }
- }
-
- Alchemy.prototype.begin = function(userConf) {
- var conf;
- conf = this.setConf(userConf);
- switch (typeof this.conf.dataSource) {
- case 'string':
- d3.json(this.a.conf.dataSource, this.a.startGraph);
- break;
- case 'object':
- this.a.startGraph(this.a.conf.dataSource);
- }
- this.plugins.init();
- Alchemy.prototype.instances.push(this);
- return this;
- };
-
- Alchemy.prototype.setConf = function(userConf) {
- var key, val;
- if (userConf.theme != null) {
- userConf = _.merge(_.cloneDeep(this.defaults), this.a.themes["" + userConf.theme]);
- }
- for (key in userConf) {
- val = userConf[key];
- switch (key) {
- case "clusterColors":
- userConf["clusterColours"] = val;
- break;
- case "backgroundColor":
- userConf["backgroundColour"] = val;
- break;
- case "nodeColor":
- userConf[nodeColour] = val;
- }
- }
- return this.a.conf = _.merge(_.cloneDeep(this.defaults), userConf);
- };
-
- Alchemy.prototype.instances = [];
-
- Alchemy.prototype.getInst = function(svg) {
- var instNumber;
- instNumber = parseInt(d3.select(svg).attr("alchInst"));
- return Alchemy.prototype.instances[instNumber];
- };
-
- return Alchemy;
-
- })();
-
- root = typeof exports !== "undefined" && exports !== null ? exports : this;
-
- root.Alchemy = Alchemy;
-
- root.alchemy = {
- begin: function(config) {
- return root.alchemy = new Alchemy(config);
- }
- };
-
- Alchemy.prototype.Create = (function() {
- function Create(instance) {
- this.a = instance;
- }
-
- Create.prototype.nodes = function() {
- var a, n, nodeMap, nodeMaps, registerNode, _i, _len;
- nodeMap = arguments[0], nodeMaps = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- a = this.a;
- registerNode = function(node) {
- var aNode;
- if (!a._nodes[node.id]) {
- aNode = new a.models.Node(node);
- a._nodes[node.id] = aNode;
- return [aNode];
- } else {
- return console.warn("A node with the id " + node.id + " already exists.\nConsider using the @a.get.nodes() method to \nretrieve the node and then using the Node methods.");
- }
- };
- nodeMaps = _.union(nodeMaps, nodeMap);
- for (_i = 0, _len = nodeMaps.length; _i < _len; _i++) {
- n = nodeMaps[_i];
- registerNode(n);
- }
- if (this.a.initial) {
- return this.a.updateGraph();
- }
- };
-
- Create.prototype.edges = function() {
- var a, allEdges, edgeMap, edgeMaps, registerEdge;
- edgeMap = arguments[0], edgeMaps = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- a = this.a;
- registerEdge = function(edge) {
- var aEdge, edgeArray;
- if (edge.id && !a._edges[edge.id]) {
- aEdge = new a.models.Edge(edge);
- a._edges[edge.id] = [aEdge];
- return [aEdge];
- } else if (edge.id && a._edges[edge.id]) {
- return console.warn("An edge with that id " + someEdgeMap.id + " already exists.\nConsider using the @a.get.edge() method to \nretrieve the edge and then using the Edge methods.\nNote: id's are not required for edges. Alchemy will create\nan unlimited number of edges for the same source and target node.\nSimply omit 'id' when creating the edge.");
- } else {
- edgeArray = a._edges["" + edge.source + "-" + edge.target];
- if (edgeArray) {
- aEdge = new a.models.Edge(edge, edgeArray.length);
- edgeArray.push(aEdge);
- return [aEdge];
- } else {
- aEdge = new a.models.Edge(edge, 0);
- a._edges["" + edge.source + "-" + edge.target] = [aEdge];
- return [aEdge];
- }
- }
- };
- allEdges = _.uniq(_.flatten(arguments));
- _.each(allEdges, function(e) {
- return registerEdge(e);
- });
- if (this.a.initial) {
- return this.a.updateGraph();
- }
- };
-
- return Create;
-
- })();
-
- Alchemy.prototype.Get = function(instance) {
- return {
- a: instance,
- _el: [],
- _elType: null,
- _makeChain: function(inp) {
- var returnedGet;
- returnedGet = this;
- returnedGet.__proto__ = [].__proto__;
- while (returnedGet.length) {
- returnedGet.pop();
- }
- _.each(inp, function(e) {
- return returnedGet.push(e);
- });
- return returnedGet;
- },
- nodes: function() {
- var a, allIDs, id, ids, nodeList;
- id = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- if (id != null) {
- allIDs = _.map(arguments, function(arg) {
- return String(arg);
- });
- a = this.a;
- nodeList = (function(a) {
- return _.filter(a._nodes, function(val, key) {
- if (_.contains(allIDs, key)) {
- return val;
- }
- });
- })(a);
- }
- this._elType = "node";
- this._el = nodeList;
- return this._makeChain(nodeList);
- },
- edges: function() {
- var a, allIDs, edgeList, id, ids;
- id = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- if (id != null) {
- allIDs = _.map(arguments, function(arg) {
- return String(arg);
- });
- a = this.a;
- edgeList = (function(a) {
- return _.flatten(_.filter(a._edges, function(val, key) {
- if (_.contains(allIDs, key)) {
- return val;
- }
- }));
- })(a);
- }
- this._elType = "edge";
- this._el = edgeList;
- return this._makeChain(edgeList);
- },
- all: function() {
- var a, elType;
- a = this.a;
- elType = this._elType;
- this._el = (function(elType) {
- switch (elType) {
- case "node":
- return a.elements.nodes.val;
- case "edge":
- return a.elements.edges.flat;
- }
- })(elType);
- return this._makeChain(this._el);
- },
- elState: function(state) {
- var elList;
- elList = _.filter(this._el, function(e) {
- return e._state === state;
- });
- this._el = elList;
- return this._makeChain(elList);
- },
- state: function(key) {
- if (this.a.state.key != null) {
- return this.a.state.key;
- }
- },
- type: function(type) {
- var elList;
- elList = _.filter(this._el, function(e) {
- return e._nodeType === type || e._edgeType === type;
- });
- this._el = elList;
- return this._makeChain(elList);
- },
- activeNodes: function() {
- return _.filter(this.a._nodes, function(node) {
- if (node._state === "active") {
- return node;
- }
- });
- },
- activeEdges: function() {
- return _.filter(this.a.get.allEdges(), function(edge) {
- if (edge._state === "active") {
- return edge;
- }
- });
- },
- state: function(key) {
- if (this.a.state.key != null) {
- return this.a.state.key;
- }
- },
- clusters: function() {
- var clusterMap, nodesByCluster;
- clusterMap = this.a.layout._clustering.clusterMap;
- nodesByCluster = {};
- _.each(clusterMap, function(key, value) {
- return nodesByCluster[value] = _.select(this.a.get.allNodes(), function(node) {
- return node.getProperties()[this.a.conf.clusterKey] === value;
- });
- });
- return nodesByCluster;
- },
- clusterColours: function() {
- var clusterColoursObject, clusterMap;
- clusterMap = this.a.layout._clustering.clusterMap;
- clusterColoursObject = {};
- _.each(clusterMap, function(key, value) {
- return clusterColoursObject[value] = this.a.conf.clusterColours[key % this.a.conf.clusterColours.length];
- });
- return clusterColoursObject;
- },
- allEdges: function() {
- return this.a.elements.nodes.flat;
- },
- allNodes: function(type) {
- if (type != null) {
- return _.filter(this.a._nodes, function(n) {
- if (n._nodeType === type) {
- return n;
- }
- });
- } else {
- return this.a.elements.nodes.val;
- }
- },
- getNodes: function() {
- var a, id, ids;
- id = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- a = this.a;
- ids.push(id);
- return _.map(ids, function(id) {
- return a._nodes[id];
- });
- },
- getEdges: function(id, target) {
- var a, edge_id;
- if (id == null) {
- id = null;
- }
- if (target == null) {
- target = null;
- }
- a = this.a;
- if ((id != null) && (target != null)) {
- edge_id = "" + id + "-" + target;
- return this.a._edges[edge_id];
- } else if ((id != null) && (target == null)) {
- return this.a._nodes[id]._adjacentEdges;
- }
- }
- };
- };
-
- Alchemy.prototype.Remove = (function() {
- function Remove(instance) {
- this.a = instance;
- }
-
- Remove.prototype.nodes = function(nodeMap) {
- return _.each(nodeMap, function(n) {
- if (n._nodeType != null) {
- return n.remove();
- }
- });
- };
-
- Remove.prototype.edges = function(edgeMap) {
- return _.each(edgeMap, function(e) {
- if (e._edgeType != null) {
- return e.remove();
- }
- });
- };
-
- return Remove;
-
- })();
-
- Alchemy.prototype.Set = function(instance) {
- return {
- a: instance,
- state: function(key, value) {
- return this.a.state.key = value;
- }
- };
- };
-
- Clustering = (function() {
- function Clustering(instance) {
- var clustering, conf, nodes, _charge, _friction, _gravity, _linkDistancefn, _linkStrength;
- this.a = instance;
- nodes = this.a._nodes;
- conf = this.a.conf;
- clustering = this;
- this.clusterKey = conf.clusterKey;
- this.identifyClusters(this.a);
- _charge = -500;
- _linkStrength = function(edge) {
- var sourceCluster, targetCluster;
- sourceCluster = nodes[edge.source.id]._properties[this.clusterKey];
- targetCluster = nodes[edge.target.id]._properties[this.clusterKey];
- if (sourceCluster === targetCluster) {
- return 0.15;
- } else {
- return 0;
- }
- };
- _friction = function() {
- return 0.7;
- };
- _linkDistancefn = function(edge) {
- nodes = edge.self.a._nodes;
- if (nodes[edge.source.id]._properties.root || nodes[edge.target.id]._properties.root) {
- return 300;
- } else if (nodes[edge.source.id]._properties[this.clusterKey] === nodes[edge.target.id]._properties[this.clusterKey]) {
- return 10;
- } else {
- return 600;
- }
- };
- _gravity = function(k) {
- return 8 * k;
- };
- this.layout = {
- charge: _charge,
- linkStrength: function(edge) {
- return _linkStrength(edge);
- },
- friction: function() {
- return _friction();
- },
- linkDistancefn: function(edge) {
- return _linkDistancefn(edge);
- },
- gravity: function(k) {
- return _gravity(k);
- }
- };
- }
-
- Clustering.prototype.identifyClusters = function(a) {
- var clusters, nodes, _i, _ref, _results;
- nodes = a.elements.nodes.val;
- clusters = _.uniq(_.map(nodes, function(node) {
- return node.getProperties()[a.conf.clusterKey];
- }));
- return this.clusterMap = _.zipObject(clusters, (function() {
- _results = [];
- for (var _i = 0, _ref = clusters.length; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
- return _results;
- }).apply(this));
- };
-
- Clustering.prototype.getClusterColour = function(clusterValue) {
- var index;
- index = this.clusterMap[clusterValue] % this.a.conf.clusterColours.length;
- return this.a.conf.clusterColours[index];
- };
-
- Clustering.prototype.edgeGradient = function(edges) {
- var Q, defs, edge, endColour, gradient, gradient_id, id, ids, nodes, startColour, _i, _len, _ref, _results;
- defs = this.a.vis.select("" + this.a.conf.divSelector + " svg");
- Q = {};
- nodes = this.a._nodes;
- _ref = _.map(edges, function(edge) {
- return edge._d3;
- });
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- edge = _ref[_i];
- if (nodes[edge.source.id]._properties.root || nodes[edge.target.id]._properties.root) {
- continue;
- }
- if (nodes[edge.source.id]._properties[this.clusterKey] === nodes[edge.target.id]._properties[this.clusterKey]) {
- continue;
- }
- if (nodes[edge.target.id]._properties[this.clusterKey] !== nodes[edge.source.id]._properties[this.clusterKey]) {
- id = nodes[edge.source.id]._properties[this.clusterKey] + "-" + nodes[edge.target.id]._properties[this.clusterKey];
- if (id in Q) {
- continue;
- } else if (!(id in Q)) {
- startColour = this.getClusterColour(nodes[edge.target.id]._properties[this.clusterKey]);
- endColour = this.getClusterColour(nodes[edge.source.id]._properties[this.clusterKey]);
- Q[id] = {
- 'startColour': startColour,
- 'endColour': endColour
- };
- }
- }
- }
- _results = [];
- for (ids in Q) {
- gradient_id = "cluster-gradient-" + ids;
- gradient = defs.append("svg:linearGradient").attr("id", gradient_id);
- gradient.append("svg:stop").attr("offset", "0%").attr("stop-color", Q[ids]['startColour']);
- _results.push(gradient.append("svg:stop").attr("offset", "100%").attr("stop-color", Q[ids]['endColour']));
- }
- return _results;
- };
-
- return Clustering;
-
- })();
-
- Alchemy.prototype.clusterControls = {
- init: function() {
- var changeClusterHTML;
- changeClusterHTML = "<input class='form-control form-inline' id='cluster-key' placeholder=\"Cluster Key\"></input>";
- this.a.dash.select("#clustering-container").append("div").attr("id", "cluster-key-container").attr('class', 'property form-inline form-group').html(changeClusterHTML).style("display", "none");
- this.a.dash.select("#cluster_control_header").on("click", function() {
- var display, element;
- element = this.a.dash.select("#cluster-key-container");
- return display = element.style("display");
- });
- element.style("display", function(e) {
- if (display === "block") {
- return "none";
- } else {
- return "block";
- }
- });
- if (this.a.dash.select("#cluster-key-container").style("display") === "none") {
- this.a.dash.select("#cluster-arrow").attr("class", "fa fa-2x fa-caret-right");
- } else {
- this.a.dash.select("#cluster-arrow").attr("class", "fa fa-2x fa-caret-down");
- }
- return this.a.dash.select("#cluster-key").on("keydown", function() {
- if (d3.event.keyIdentifier === "Enter") {
- this.a.conf.cluster = true;
- this.a.conf.clusterKey = this.value;
- return this.a.generateLayout();
- }
- });
- }
- };
-
- Alchemy.prototype.controlDash = function(instance) {
- var a;
- a = instance;
- return {
- init: function() {
- var divSelector;
- if (this.dashIsShown()) {
- divSelector = a.conf.divSelector;
- a.dash = d3.select("" + divSelector).append("div").attr("id", "control-dash-wrapper").attr("class", "col-md-4 initial");
- a.dash.append("i").attr("id", "dash-toggle").attr("class", "fa fa-flask col-md-offset-12");
- a.dash.append("div").attr("id", "control-dash").attr("class", "col-md-12");
- a.dash.select('#dash-toggle').on('click', a.interactions.toggleControlDash);
- a.controlDash.zoomCtrl();
- a.controlDash.search();
- a.controlDash.filters();
- a.controlDash.stats();
- a.controlDash.clustering();
- return a.controlDash.exports();
- }
- },
- search: function() {
- if (a.conf.search) {
- a.dash.select("#control-dash").append("div").attr("id", "search").html("<div class='input-group'>\n <input class='form-control' placeholder='Search'>\n <i class='input-group-addon search-icon'><span class='fa fa-search fa-1x'></span></i>\n</div> ");
- return a.search.init();
- }
- },
- zoomCtrl: function() {
- if (a.conf.zoomControls) {
- a.dash.select("#control-dash-wrapper").append("div").attr("id", "zoom-controls").attr("class", "col-md-offset-12").html("<button id='zoom-reset' class='btn btn-defualt btn-primary'><i class='fa fa-crosshairs fa-lg'></i></button> <button id='zoom-in' class='btn btn-defualt btn-primary'><i class='fa fa-plus'></i></button> <button id='zoom-out' class='btn btn-default btn-primary'><i class='fa fa-minus'></i></button>");
- a.dash.select('#zoom-in').on("click", function() {
- return a.interactions.clickZoom('in');
- });
- a.dash.select('#zoom-out').on("click", function() {
- return a.interactions.clickZoom('out');
- });
- return a.dash.select('#zoom-reset').on("click", function() {
- return a.interactions.clickZoom('reset');
- });
- }
- },
- filters: function() {
- if (a.conf.nodeFilters || a.conf.edgeFilters) {
- a.dash.select("#control-dash").append("div").attr("id", "filters");
- return a.filters.init();
- }
- },
- stats: function() {
- var stats_html;
- if (a.conf.nodeStats || a.conf.edgeStats) {
- stats_html = "<div id = \"stats-header\" data-toggle=\"collapse\" data-target=\"#stats #all-stats\">\n<h3>\n Statistics\n</h3>\n<span class = \"fa fa-caret-right fa-2x\"></span>\n</div>\n<div id=\"all-stats\" class=\"collapse\">\n <ul class = \"list-group\" id=\"node-stats\"></ul>\n <ul class = \"list-group\" id=\"rel-stats\"></ul> \n</div>";
- a.dash.select("#control-dash").append("div").attr("id", "stats").html(stats_html).select('#stats-header').on('click', function() {
- if (a.dash.select('#all-stats').classed("in")) {
- return a.dash.select("#stats-header>span").attr("class", "fa fa-2x fa-caret-right");
- } else {
- return a.dash.select("#stats-header>span").attr("class", "fa fa-2x fa-caret-down");
- }
- });
- return a.stats.init();
- }
- },
- exports: function() {
- var exports_html;
- if (a.conf.exportSVG) {
- exports_html = "<div id=\"exports-header\" data-toggle=\"collapse\" data-target=\"#all-exports\" style=\"padding:10px;\">\n <h3>\n Exports\n </h3>\n <span class=\"fa fa-caret-right fa-2x\"></span>\n</div>\n<div id=\"all-exports\" class=\"collapse\"></div>";
- a.dash.select("#control-dash").append("div").attr("id", "exports").attr("style", "padding: 0.5em 1em; border-bottom: thin dashed #E89619; color: white;").html(exports_html).select("#exports-header");
- return a.exports.init();
- }
- },
- clustering: function() {
- var clusterControl_html;
- if (a.conf.clusterControl) {
- clusterControl_html = "<div id=\"clustering-container\">\n <div id=\"cluster_control_header\" data-toggle=\"collapse\" data-target=\"#clustering #cluster-options\">\n <h3>Clustering</h3>\n <span id=\"cluster-arrow\" class=\"fa fa-2x fa-caret-right\"></span>\n </div>\n</div>";
- a.dash.select("#control-dash").append("div").attr("id", "clustering").html(clusterControl_html).select('#cluster_control_header');
- return a.clusterControls.init();
- }
- },
- dashIsShown: function() {
- var conf;
- conf = a.conf;
- return conf.showEditor || conf.captionToggle || conf.toggleRootNodes || conf.removeElement || conf.clusterControl || conf.nodeStats || conf.edgeStats || conf.edgeFilters || conf.nodeFilters || conf.edgesToggle || conf.nodesToggle || conf.search || conf.exportSVG;
- }
- };
- };
-
- Alchemy.prototype.filters = (function(_this) {
- return function(instance) {
- var a;
- a = instance;
- return {
- init: function() {
- var caption, edgeType, edgeTypes, nodeKey, nodeType, nodeTypes, types, _i, _j, _len, _len1, _ref;
- a.filters.show();
- if (a.conf.edgeFilters) {
- a.filters.showEdgeFilters();
- }
- if (a.conf.nodeFilters) {
- a.filters.showNodeFilters();
- }
- if (a.conf.nodeTypes) {
- nodeKey = Object.keys(a.conf.nodeTypes);
- nodeTypes = '';
- _ref = a.conf.nodeTypes[nodeKey];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- nodeType = _ref[_i];
- caption = nodeType.replace('_', ' ');
- nodeTypes += "<li class='list-group-item nodeType' role='menuitem' id='li-" + nodeType + "' name=" + nodeType + ">" + caption + "</li>";
- }
- a.dash.select('#node-dropdown').html(nodeTypes);
- }
- if (a.conf.edgeTypes) {
- if (_.isPlainObject(a.conf.edgeTypes)) {
- types = _.values(a.conf.edgeTypes)[0];
- } else {
- types = a.conf.edgeTypes;
- }
- edgeTypes = '';
- for (_j = 0, _len1 = types.length; _j < _len1; _j++) {
- edgeType = types[_j];
- caption = edgeType.replace('_', ' ');
- edgeTypes += "<li class='list-group-item edgeType' role='menuitem' id='li-" + edgeType + "' name=" + edgeType + ">" + caption + "</li>";
- }
- a.dash.select('#rel-dropdown').html(edgeTypes);
- }
- if (a.conf.captionsToggle) {
- a.filters.captionsToggle();
- }
- if (a.conf.edgesToggle) {
- a.filters.edgesToggle();
- }
- if (a.conf.nodesToggle) {
- a.filters.nodesToggle();
- }
- return a.filters.update();
- },
- show: function() {
- var filter_html;
- filter_html = "<div id = \"filter-header\" data-toggle=\"collapse\" data-target=\"#filters form\">\n <h3>Filters</h3>\n <span class = \"fa fa-2x fa-caret-right\"></span>\n</div>\n <form class=\"form-inline collapse\">\n </form>";
- a.dash.select('#control-dash #filters').html(filter_html);
- a.dash.selectAll('#filter-header').on('click', function() {
- if (a.dash.select('#filters>form').classed("in")) {
- return a.dash.select("#filter-header>span").attr("class", "fa fa-2x fa-caret-right");
- } else {
- return a.dash.select("#filter-header>span").attr("class", "fa fa-2x fa-caret-down");
- }
- });
- return a.dash.select('#filters form');
- },
- showEdgeFilters: function() {
- var rel_filter_html;
- rel_filter_html = "<div id=\"filter-rel-header\" data-target = \"#rel-dropdown\" data-toggle=\"collapse\">\n <h4>\n Edge Types\n </h4>\n <span class=\"fa fa-lg fa-caret-right\"></span>\n</div>\n<ul id=\"rel-dropdown\" class=\"collapse list-group\" role=\"menu\">\n</ul>";
- a.dash.select('#filters form').append("div").attr("id", "filter-relationships").html(rel_filter_html);
- return a.dash.select("#filter-rel-header").on('click', function() {
- if (a.dash.select('#rel-dropdown').classed("in")) {
- return a.dash.select("#filter-rel-header>span").attr("class", "fa fa-lg fa-caret-right");
- } else {
- return a.dash.select("#filter-rel-header>span").attr("class", "fa fa-lg fa-caret-down");
- }
- });
- },
- showNodeFilters: function() {
- var node_filter_html;
- node_filter_html = "<div id=\"filter-node-header\" data-target = \"#node-dropdown\" data-toggle=\"collapse\">\n <h4>\n Node Types\n </h4>\n <span class=\"fa fa-lg fa-caret-right\"></span>\n</div>\n<ul id=\"node-dropdown\" class=\"collapse list-group\" role=\"menu\">\n</ul>";
- a.dash.select('#filters form').append("div").attr("id", "filter-nodes").html(node_filter_html);
- return a.dash.select("#filter-node-header").on('click', function() {
- if (a.dash.select('#node-dropdown').classed("in")) {
- return a.dash.select("#filter-node-header>span").attr("class", "fa fa-lg fa-caret-right");
- } else {
- return a.dash.select("#filter-node-header>span").attr("class", "fa fa-lg fa-caret-down");
- }
- });
- },
- captionsToggle: function() {
- return a.dash.select("#filters form").append("li").attr({
- "id": "toggle-captions",
- "class": "list-group-item active-label toggle"
- }).html("Show Captions").on("click", function() {
- var isDisplayed;
- isDisplayed = a.dash.select("g text").attr("style");
- if (isDisplayed === "display: block" || null) {
- return a.dash.selectAll("g text").attr("style", "display: none");
- } else {
- return a.dash.selectAll("g text").attr("style", "display: block");
- }
- });
- },
- edgesToggle: function() {
- return a.dash.select("#filters form").append("li").attr({
- "id": "toggle-edges",
- "class": "list-group-item active-label toggle"
- }).html("Toggle Edges").on("click", function() {
- if (_.contains(_.pluck(_.flatten(_.values(a._edges)), "_state"), "active")) {
- return _.each(_.values(a._edges), function(edges) {
- return _.each(edges, function(e) {
- if (e._state === "active") {
- return e.toggleHidden();
- }
- });
- });
- } else {
- return _.each(_.values(a._edges), function(edges) {
- return _.each(edges, function(e) {
- var source, target;
- source = a._nodes[e._properties.source];
- target = a._nodes[e._properties.target];
- if (source._state === "active" && target._state === "active") {
- return e.toggleHidden();
- }
- });
- });
- }
- });
- },
- nodesToggle: function() {
- return a.dash.select("#filters form").append("li").attr({
- "id": "toggle-nodes",
- "class": "list-group-item active-label toggle"
- }).html("Toggle Nodes").on("click", function() {
- var nodes;
- nodes = _.values(a._nodes);
- if (_.contains(_.pluck(nodes, "_state"), "active")) {
- return _.each(nodes, function(n) {
- if (a.conf.toggleRootNodes && n._d3.root) {
- return;
- }
- if (n._state === "active") {
- return n.toggleHidden();
- }
- });
- } else {
- return _.each(_.values(a._nodes), function(n) {
- if (a.conf.toggleRootNodes && n._d3.root) {
- return;
- }
- return n.toggleHidden();
- });
- }
- });
- },
- update: function() {
- return a.dash.selectAll(".nodeType, .edgeType").on("click", function() {
- var element, tag;
- element = d3.select(this);
- tag = element.attr("name");
- a.vis.selectAll("." + tag).each(function(d) {
- var edge, node, source, target;
- if (a._nodes[d.id] != null) {
- node = a._nodes[d.id];
- return node.toggleHidden();
- } else {
- edge = a._edges[d.id][0];
- source = a._nodes[edge._properties.source];
- target = a._nodes[edge._properties.target];
- if (source._state === "active" && target._state === "active") {
- return edge.toggleHidden();
- }
- }
- });
- return a.stats.nodeStats();
- });
- }
- };
- };
- })(this);
-
- Alchemy.prototype.Index = function(instance, all) {
- var a, edges, elements, nodes;
- a = instance;
- elements = {
- nodes: {
- val: (function() {
- return _.values(a._nodes);
- })()
- },
- edges: {
- val: (function() {
- return _.values(a._edges);
- })()
- }
- };
- nodes = elements.nodes;
- edges = elements.edges;
- elements.edges.flat = (function() {
- return _.flatten(edges.val);
- })();
- elements.nodes.d3 = (function() {
- return _.map(nodes.val, function(n) {
- return n._d3;
- });
- })();
- elements.edges.d3 = (function() {
- return _.map(edges.flat, function(e) {
- return e._d3;
- });
- })();
- a.elements = elements;
- return function() {
- a.elements.nodes.svg = (function() {
- return a.vis.selectAll('g.node');
- })();
- return a.elements.edges.svg = (function() {
- return a.vis.selectAll('g.edge');
- })();
- };
- };
-
- Alchemy.prototype.interactions = function(instance) {
- var a;
- a = instance;
- return {
- edgeClick: function(d) {
- var edge;
- if (d3.event.defaultPrevented) {
- return;
- }
- d3.event.stopPropagation();
- edge = d.self;
- if (typeof a.conf.edgeClick === 'function') {
- a.conf.edgeClick(edge);
- }
- if (edge._state !== "hidden") {
- edge._state = (function() {
- if (edge._state === "selected") {
- return "active";
- }
- return "selected";
- })();
- return edge.setStyles();
- }
- },
- edgeMouseOver: function(d) {
- var edge;
- edge = d.self;
- if (edge._state !== "hidden") {
- if (edge._state !== "selected") {
- edge._state = "highlighted";
- }
- return edge.setStyles();
- }
- },
- edgeMouseOut: function(d) {
- var edge;
- edge = d.self;
- if (edge._state !== "hidden") {
- if (edge._state !== "selected") {
- edge._state = "active";
- }
- return edge.setStyles();
- }
- },
- nodeMouseOver: function(n) {
- var node;
- node = n.self;
- if (node._state !== "hidden") {
- if (node._state !== "selected") {
- node._state = "highlighted";
- node.setStyles();
- }
- if (typeof a.conf.nodeMouseOver === 'function') {
- return a.conf.nodeMouseOver(node);
- } else if (typeof a.conf.nodeMouseOver === ('number' || 'string')) {
- return node.properties[a.conf.nodeMouseOver];
- }
- }
- },
- nodeMouseOut: function(n) {
- var node;
- node = n.self;
- a = node.a;
- if (node._state !== "hidden") {
- if (node._state !== "selected") {
- node._state = "active";
- node.setStyles();
- }
- if ((a.conf.nodeMouseOut != null) && typeof a.conf.nodeMouseOut === 'function') {
- return a.conf.nodeMouseOut(n);
- }
- }
- },
- nodeClick: function(n) {
- var node;
- if (d3.event.defaultPrevented) {
- return;
- }
- d3.event.stopPropagation();
- node = n.self;
- if (typeof a.conf.nodeClick === 'function') {
- a.conf.nodeClick(node);
- }
- if (node._state !== "hidden") {
- node._state = (function() {
- if (node._state === "selected") {
- return "active";
- }
- return "selected";
- })();
- return node.setStyles();
- }
- },
- zoom: function(extent) {
- if (this._zoomBehavior == null) {
- this._zoomBehavior = d3.behavior.zoom();
- }
- return this._zoomBehavior.scaleExtent(extent).on("zoom", function(d) {
- a = Alchemy.prototype.getInst(this);
- return a.vis.attr("transform", "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")");
- });
- },
- clickZoom: function(direction) {
- var scale, x, y, _ref;
- _ref = a.vis.attr("transform").match(/(-*\d+\.*\d*)/g).map(function(a) {
- return parseFloat(a);
- }), x = _ref[0], y = _ref[1], scale = _ref[2];
- a.vis.attr("transform", function() {
- if (direction === "in") {
- if (scale < a.conf.scaleExtent[1]) {
- scale += 0.2;
- }
- return "translate(" + x + "," + y + ") scale(" + scale + ")";
- } else if (direction === "out") {
- if (scale > a.conf.scaleExtent[0]) {
- scale -= 0.2;
- }
- return "translate(" + x + "," + y + ") scale(" + scale + ")";
- } else if (direction === "reset") {
- return "translate(0,0) scale(1)";
- } else {
- return console.log('error');
- }
- });
- if (this._zoomBehavior == null) {
- this._zoomBehavior = d3.behavior.zoom();
- }
- return this._zoomBehavior.scale(scale).translate([x, y]);
- },
- nodeDragStarted: function(d, i) {
- d3.event.preventDefault;
- d3.event.sourceEvent.stopPropagation();
- d3.select(this).classed("dragging", true);
- return d.fixed = true;
- },
- nodeDragged: function(d, i) {
- var edges, node;
- a = d.self.a;
- d.x += d3.event.dx;
- d.y += d3.event.dy;
- d.px += d3.event.dx;
- d.py += d3.event.dy;
- node = d3.select(this);
- node.attr("transform", "translate(" + d.x + ", " + d.y + ")");
- edges = d.self._adjacentEdges;
- return _.each(edges, function(edge) {
- var selection;
- selection = a.vis.select("#edge-" + edge.id + "-" + edge._index);
- return a._drawEdges.updateEdge(selection.data()[0]);
- });
- },
- nodeDragended: function(d, i) {
- a = d.self.a;
- d3.select(this).classed({
- "dragging": false
- });
- if (!a.conf.forceLocked) {
- return a.force.start();
- }
- },
- nodeDoubleClick: function(d) {
- return null;
- },
- deselectAll: function() {
- var _ref;
- a = Alchemy.prototype.getInst(this);
- if ((_ref = d3.event) != null ? _ref.defaultPrevented : void 0) {
- return;
- }
- if (a.conf.showEditor === true) {
- a.modifyElements.nodeEditorClear();
- }
- _.each(a._nodes, function(n) {
- n._state = "active";
- return n.setStyles();
- });
- _.each(a._edges, function(edge) {
- return _.each(edge, function(e) {
- e._state = "active";
- return e.setStyles();
- });
- });
- if (a.conf.deselectAll && typeof (a.conf.deselectAll === 'function')) {
- return a.conf.deselectAll();
- }
- }
- };
- };
-
- Layout = (function() {
- function Layout(instance) {
- this.tick = __bind(this.tick, this);
- this.linkStrength = __bind(this.linkStrength, this);
- this.gravity = __bind(this.gravity, this);
- var a, conf, nodes;
- this.a = a = instance;
- conf = this.a.conf;
- nodes = this.a._nodes;
- this.k = Math.sqrt(Math.log(_.size(this.a._nodes)) / (conf.graphWidth() * conf.graphHeight()));
- this._clustering = new this.a.clustering(this.a);
- this.d3NodeInternals = a.elements.nodes.d3;
- if (conf.cluster) {
- this._charge = function() {
- return this._clustering.layout.charge;
- };
- this._linkStrength = function(edge) {
- return this._clustering.layout.linkStrength(edge);
- };
- } else {
- this._charge = function() {
- return -10 / this.k;
- };
- this._linkStrength = function(edge) {
- if (nodes[edge.source.id].getProperties('root') || nodes[edge.target.id].getProperties('root')) {
- return 1;
- } else {
- return 0.9;
- }
- };
- }
- if (conf.cluster) {
- this._linkDistancefn = function(edge) {
- return this._clustering.layout.linkDistancefn(edge);
- };
- } else if (conf.linkDistancefn === 'default') {
- this._linkDistancefn = function(edge) {
- return 1 / (this.k * 50);
- };
- } else if (typeof conf.linkDistancefn === 'number') {
- this._linkDistancefn = function(edge) {
- return conf.linkDistancefn;
- };
- } else if (typeof conf.linkDistancefn === 'function') {
- this._linkDistancefn = function(edge) {
- return conf.linkDistancefn(edge);
- };
- }
- }
-
- Layout.prototype.gravity = function() {
- if (this.a.conf.cluster) {
- return this._clustering.layout.gravity(this.k);
- } else {
- return 50 * this.k;
- }
- };
-
- Layout.prototype.linkStrength = function(edge) {
- return this._linkStrength(edge);
- };
-
- Layout.prototype.friction = function() {
- return 0.9;
- };
-
- Layout.prototype.collide = function(node) {
- var conf, nx1, nx2, ny1, ny2, r;
- conf = this.a.conf;
- r = 2 * (node.radius + node['stroke-width']) + conf.nodeOverlap;
- nx1 = node.x - r;
- nx2 = node.x + r;
- ny1 = node.y - r;
- ny2 = node.y + r;
- return function(quad, x1, y1, x2, y2) {
- var l, x, y;
- if (quad.point && (quad.point !== node)) {
- x = node.x - Math.abs(quad.point.x);
- y = node.y - quad.point.y;
- l = Math.sqrt(x * x + y * y);
- r = r;
- if (l < r) {
- l = (l - r) / l * conf.alpha;
- node.x -= x *= l;
- node.y -= y *= l;
- quad.point.x += x;
- quad.point.y += y;
- }
- }
- return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
- };
- };
-
- Layout.prototype.tick = function(draw) {
- var a, edges, node, nodes, q, _i, _len, _ref;
- a = this.a;
- nodes = a.elements.nodes.svg;
- edges = a.elements.edges.svg;
- if (a.conf.collisionDetection) {
- q = d3.geom.quadtree(this.d3NodeInternals);
- _ref = this.d3NodeInternals;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- node = _ref[_i];
- q.visit(this.collide(node));
- }
- }
- nodes.attr("transform", function(d) {
- return "translate(" + d.x + "," + d.y + ")";
- });
- this.drawEdge = a.drawing.DrawEdge;
- this.drawEdge.styleText(edges);
- return this.drawEdge.styleLink(edges);
- };
-
- Layout.prototype.positionRootNodes = function() {
- var conf, container, i, n, rootNodes, _i, _len, _ref, _ref1, _results;
- conf = this.a.conf;
- container = {
- width: conf.graphWidth(),
- height: conf.graphHeight()
- };
- rootNodes = _.filter(this.a.elements.nodes.val, function(node) {
- return node.getProperties('root');
- });
- if (rootNodes.length === 1) {
- n = rootNodes[0];
- _ref = [container.width / 2, container.width / 2], n._d3.x = _ref[0], n._d3.px = _ref[1];
- _ref1 = [container.height / 2, container.height / 2], n._d3.y = _ref1[0], n._d3.py = _ref1[1];
- n._d3.fixed = true;
- } else {
- _results = [];
- for (i = _i = 0, _len = rootNodes.length; _i < _len; i = ++_i) {
- n = rootNodes[i];
- n._d3.x = container.width / Math.sqrt(rootNodes.length * (i + 1));
- n._d3.y = container.height / 2;
- _results.push(n._d3.fixed = true);
- }
- return _results;
- }
- };
-
- Layout.prototype.chargeDistance = function() {
- return 500;
- };
-
- Layout.prototype.linkDistancefn = function(edge) {
- return this._linkDistancefn(edge);
- };
-
- Layout.prototype.charge = function() {
- return this._charge();
- };
-
- return Layout;
-
- })();
-
- Alchemy.prototype.generateLayout = function(instance) {
- var a;
- a = instance;
- return function(start) {
- var conf;
- if (start == null) {
- start = false;
- }
- conf = a.conf;
- a.layout = new Layout(a);
- return a.force = d3.layout.force().size([conf.graphWidth(), conf.graphHeight()]).theta(1.0).gravity(a.layout.gravity()).friction(a.layout.friction()).nodes(a.elements.nodes.d3).links(a.elements.edges.d3).linkDistance(function(link) {
- return a.layout.linkDistancefn(link);
- }).linkStrength(function(link) {
- return a.layout.linkStrength(link);
- }).charge(a.layout.charge()).chargeDistance(a.layout.chargeDistance());
- };
- };
-
- Alchemy.prototype.search = function(instance) {
- var a;
- a = instance;
- return {
- init: function() {
- var searchBox;
- searchBox = a.dash.select("#search input");
- return searchBox.on("keyup", function() {
- var input;
- input = searchBox[0][0].value.toLowerCase();
- a.vis.selectAll(".node").classed("inactive", false);
- a.vis.selectAll("text").attr("style", function() {
- if (input !== "") {
- return "display: inline;";
- }
- });
- return a.vis.selectAll(".node").classed("inactive", function(node) {
- var DOMtext, hidden;
- DOMtext = d3.select(this).text();
- switch (a.conf.searchMethod) {
- case 'contains':
- hidden = DOMtext.toLowerCase().indexOf(input) < 0;
- break;
- case 'begins':
- hidden = DOMtext.toLowerCase().indexOf(input) !== 0;
- }
- if (hidden) {
- a.vis.selectAll("[source-target*='" + node.id + "']").classed("inactive", hidden);
- } else {
- a.vis.selectAll("[source-target*='" + node.id + "']").classed("inactive", function(edge) {
- var nodeIDs, sourceHidden, targetHidden;
- nodeIDs = [edge.source.id, edge.target.id];
- sourceHidden = a.vis.select("#node-" + nodeIDs[0]).classed("inactive");
- targetHidden = a.vis.select("#node-" + nodeIDs[1]).classed("inactive");
- return targetHidden || sourceHidden;
- });
- }
- return hidden;
- });
- });
- }
- };
- };
-
- Alchemy.prototype.startGraph = function(instance) {
- var a;
- a = instance;
- return function(data) {
- var conf, d3Edges, d3Nodes, defs, editor, editorInteractions;
- conf = a.conf;
- if (d3.select(conf.divSelector).empty()) {
- console.warn(a.utils.warnings.divWarning());
- }
- if (!data) {
- data = {
- nodes: [],
- edges: []
- };
- a.utils.warnings.dataWarning();
- }
- if (data.edges == null) {
- data.edges = [];
- }
- a.create.nodes(data.nodes);
- data.edges.forEach(function(e) {
- return a.create.edges(e);
- });
- a.vis = d3.select(conf.divSelector).attr("style", "width:" + (conf.graphWidth()) + "px; height:" + (conf.graphHeight()) + "px; background:" + conf.backgroundColour + ";").append("svg").attr("xmlns", "http://www.w3.org/2000/svg").attr("xlink", "http://www.w3.org/1999/xlink").attr("pointer-events", "all").attr("style", "background:" + conf.backgroundColour + ";").attr("alchInst", Alchemy.prototype.instances.length - 1).on('click', a.interactions.deselectAll).call(a.interactions.zoom(conf.scaleExtent)).on("dblclick.zoom", null).append('g').attr("transform", "translate(" + conf.initialTranslate + ") scale(" + conf.initialScale + ")");
- a.interactions.zoom().scale(conf.initialScale);
- a.interactions.zoom().translate(conf.initialTranslate);
- a.index = Alchemy.prototype.Index(a);
- a.generateLayout();
- a.controlDash.init();
- d3Edges = a.elements.edges.d3;
- d3Nodes = a.elements.nodes.d3;
- a.layout.positionRootNodes();
- a.force.start();
- if (conf.forceLocked) {
- while (a.force.alpha() > 0.005) {
- a.force.tick();
- }
- }
- a._drawEdges = a.drawing.DrawEdges;
- a._drawNodes = a.drawing.DrawNodes;
- a._drawEdges.createEdge(d3Edges);
- a._drawNodes.createNode(d3Nodes);
- a.index();
- a.elements.nodes.svg.attr("transform", function(id, i) {
- return "translate(" + id.x + ", " + id.y + ")";
- });
- console.log(Date() + ' completed initial computation');
- if (!conf.forceLocked) {
- a.force.on("tick", a.layout.tick).start();
- }
- if (conf.afterLoad != null) {
- if (typeof conf.afterLoad === 'function') {
- conf.afterLoad();
- } else if (typeof conf.afterLoad === 'string') {
- a[conf.afterLoad] = true;
- }
- }
- if (conf.cluster) {
- defs = d3.select("" + a.conf.divSelector + " svg").append("svg:defs");
- }
- if (conf.nodeStats) {
- a.stats.nodeStats();
- }
- if (conf.showEditor) {
- editor = new a.editor.Editor;
- editorInteractions = new a.editor.Interactions;
- d3.select("body").on('keydown', editorInteractions.deleteSelected);
- editor.startEditor();
- }
- return a.initial = true;
- };
- };
-
- Alchemy.prototype.stats = function(instance) {
- var a;
- a = instance;
- return {
- init: function() {
- return a.stats.update();
- },
- nodeStats: function() {
- var activeNodes, allNodes, caption, inactiveNodes, nodeData, nodeGraph, nodeKeys, nodeNum, nodeStats, nodeType, nodeTypes, _i, _len, _ref;
- nodeData = [];
- allNodes = a.get.allNodes().length;
- activeNodes = a.get.activeNodes().length;
- inactiveNodes = allNodes - activeNodes;
- nodeStats = "<li class = 'list-group-item gen_node_stat'>Number of nodes: <span class='badge'>" + allNodes + "</span></li> <li class = 'list-group-item gen_node_stat'>Number of active nodes: <span class='badge'>" + activeNodes + "</span></li> <li class = 'list-group-item gen_node_stat'>Number of inactive nodes: <span class='badge'>" + inactiveNodes + "</span></li></br>";
- if (a.conf.nodeTypes) {
- nodeKeys = Object.keys(a.conf.nodeTypes);
- nodeTypes = '';
- _ref = a.conf.nodeTypes[nodeKeys];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- nodeType = _ref[_i];
- caption = nodeType.replace('_', ' ');
- nodeNum = a.vis.selectAll("g.node." + nodeType)[0].length;
- nodeTypes += "<li class = 'list-group-item nodeType' id='li-" + nodeType + "' name = " + caption + ">Number of <strong style='text-transform: uppercase'>" + caption + "</strong> nodes: <span class='badge'>" + nodeNum + "</span></li>";
- nodeData.push(["" + nodeType, nodeNum]);
- }
- nodeStats += nodeTypes;
- }
- nodeGraph = "<li id='node-stats-graph' class='list-group-item'></li>";
- nodeStats += nodeGraph;
- a.dash.select('#node-stats').html(nodeStats);
- return this.insertSVG("node", nodeData);
- },
- edgeStats: function() {
- var activeEdges, allEdges, caption, edgeData, edgeGraph, edgeKeys, edgeNum, edgeStats, edgeType, edgeTypes, inactiveEdges, _i, _len;
- edgeData = [];
- allEdges = a.get.allEdges().length;
- activeEdges = a.get.activeEdges().length;
- inactiveEdges = allEdges - activeEdges;
- edgeStats = "<li class = 'list-group-item gen_edge_stat'>Number of relationships: <span class='badge'>" + allEdges + "</span></li> <li class = 'list-group-item gen_edge_stat'>Number of active relationships: <span class='badge'>" + activeEdges + "</span></li> <li class = 'list-group-item gen_edge_stat'>Number of inactive relationships: <span class='badge'>" + inactiveEdges + "</span></li></br>";
- if (a.conf.edgeTypes) {
- edgeKeys = _.values(alchemy.conf.edgeTypes)[0];
- edgeTypes = '';
- for (_i = 0, _len = edgeKeys.length; _i < _len; _i++) {
- edgeType = edgeKeys[_i];
- if (!edgeType) {
- continue;
- }
- caption = edgeType.replace('_', ' ');
- edgeNum = _.filter(a.get.allEdges(), function(edge) {
- if (edge._edgeType === edgeType) {
- return edge;
- }
- }).length;
- edgeTypes += "<li class = 'list-group-item edgeType' id='li-" + edgeType + "' name = " + caption + ">Number of <strong style='text-transform: uppercase'>" + caption + "</strong> relationships: <span class='badge'>" + edgeNum + "</span></li>";
- edgeData.push(["" + caption, edgeNum]);
- }
- edgeStats += edgeTypes;
- }
- edgeGraph = "<li id='node-stats-graph' class='list-group-item'></li>";
- edgeStats += edgeGraph;
- a.dash.select('#rel-stats').html(edgeStats);
- return this.insertSVG("edge", edgeData);
- },
- insertSVG: function(element, data) {
- var arc, arcs, color, height, pie, radius, svg, width;
- if (data === null) {
- return a.dash.select("#" + element + "-stats-graph").html("<br><h4 class='no-data'>There are no " + element + "Types listed in your conf.</h4>");
- } else {
- width = a.conf.graphWidth() * .25;
- height = 250;
- radius = width / 4;
- color = d3.scale.category20();
- arc = d3.svg.arc().outerRadius(radius - 10).innerRadius(radius / 2);
- pie = d3.layout.pie().sort(null).value(function(d) {
- return d[1];
- });
- svg = a.dash.select("#" + element + "-stats-graph").append("svg").append("g").style({
- "width": width,
- "height": height
- }).attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
- arcs = svg.selectAll(".arc").data(pie(data)).enter().append("g").classed("arc", true).on("mouseover", function(d, i) {
- return a.dash.select("#" + data[i][0] + "-stat").classed("hidden", false);
- }).on("mouseout", function(d, i) {
- return a.dash.select("#" + data[i][0] + "-stat").classed("hidden", true);
- });
- arcs.append("path").attr("d", arc).attr("stroke", function(d, i) {
- return color(i);
- }).attr("stroke-width", 2).attr("fill-opacity", "0.3");
- return arcs.append("text").attr("transform", function(d) {
- return "translate(" + arc.centroid(d) + ")";
- }).attr("id", function(d, i) {
- return "" + data[i][0] + "-stat";
- }).attr("dy", ".35em").classed("hidden", true).text(function(d, i) {
- return data[i][0];
- });
- }
- },
- update: function() {
- if (a.conf.nodeStats) {
- this.nodeStats();
- }
- if (a.conf.edgeStats) {
- return this.edgeStats();
- }
- }
- };
- };
-
- Alchemy.prototype.updateGraph = function(instance) {
- var a;
- a = instance;
- return function() {
- a.generateLayout();
- a._drawEdges.createEdge(a.elements.edges.d3);
- a._drawNodes.createNode(a.elements.nodes.d3);
- a.layout.positionRootNodes();
- a.force.start();
- while (a.force.alpha() > 0.005) {
- a.force.tick();
- }
- a.force.on("tick", a.layout.tick).start();
- return a.elements.nodes.svg.attr('transform', function(id, i) {
- return "translate(" + id.x + ", " + id.y + ")";
- });
- };
- };
-
- Alchemy.prototype.defaults = {
- plugins: null,
- renderer: "svg",
- graphWidth: function() {
- return d3.select(this.divSelector).node().parentElement.clientWidth;
- },
- graphHeight: function() {
- if (d3.select(this.divSelector).node().parentElement.nodeName === "BODY") {
- return window.innerHeight;
- } else {
- return d3.select(this.divSelector).node().parentElement.clientHeight;
- }
- },
- alpha: 0.5,
- collisionDetection: true,
- nodeOverlap: 25,
- fixNodes: false,
- fixRootNodes: false,
- forceLocked: true,
- linkDistancefn: 'default',
- nodePositions: null,
- showEditor: false,
- captionToggle: false,
- toggleRootNodes: false,
- removeElement: false,
- cluster: false,
- clusterKey: "cluster",
- clusterColours: d3.shuffle(["#DD79FF", "#FFFC00", "#00FF30", "#5168FF", "#00C0FF", "#FF004B", "#00CDCD", "#f83f00", "#f800df", "#ff8d8f", "#ffcd00", "#184fff", "#ff7e00"]),
- clusterControl: false,
- nodeStats: false,
- edgeStats: false,
- edgeFilters: false,
- nodeFilters: false,
- edgesToggle: false,
- nodesToggle: false,
- zoomControls: false,
- nodeCaption: 'caption',
- nodeCaptionsOnByDefault: false,
- nodeStyle: {
- "all": {
- "radius": 10,
- "color": "#68B9FE",
- "borderColor": "#127DC1",
- "borderWidth": function(d, radius) {
- return radius / 3;
- },
- "captionColor": "#FFFFFF",
- "captionBackground": null,
- "captionSize": 12,
- "selected": {
- "color": "#FFFFFF",
- "borderColor": "#349FE3"
- },
- "highlighted": {
- "color": "#EEEEFF"
- },
- "hidden": {
- "color": "none",
- "borderColor": "none"
- }
- }
- },
- nodeColour: null,
- nodeMouseOver: 'caption',
- nodeRadius: 10,
- nodeTypes: null,
- rootNodes: 'root',
- rootNodeRadius: 15,
- nodeClick: null,
- edgeCaption: 'caption',
- edgeCaptionsOnByDefault: false,
- edgeStyle: {
- "all": {
- "width": 4,
- "color": "#CCC",
- "opacity": 0.2,
- "directed": true,
- "curved": true,
- "selected": {
- "opacity": 1
- },
- "highlighted": {
- "opacity": 1
- },
- "hidden": {
- "opacity": 0
- }
- }
- },
- edgeTypes: null,
- curvedEdges: false,
- edgeWidth: function() {
- return 4;
- },
- edgeOverlayWidth: 20,
- directedEdges: false,
- edgeArrowSize: 5,
- edgeClick: null,
- search: false,
- searchMethod: "contains",
- backgroundColour: "#000000",
- theme: null,
- afterLoad: 'afterLoad',
- divSelector: '#alchemy',
- dataSource: null,
- initialScale: 1,
- initialTranslate: [0, 0],
- scaleExtent: [0.5, 2.4],
- exportSVG: false,
- dataWarning: "default",
- warningMessage: "There be no data! What's going on?"
- };
-
- DrawEdge = function(instance) {
- return {
- a: instance,
- createLink: function(edge) {
- var conf;
- conf = this.a.conf;
- edge.append('path').attr('class', 'edge-line').attr('id', function(d) {
- return "path-" + d.id;
- });
- edge.filter(function(d) {
- return d.caption != null;
- }).append('text');
- return edge.append('path').attr('class', 'edge-handler').style('stroke-width', "" + conf.edgeOverlayWidth).style('opacity', "0");
- },
- styleLink: function(edge) {
- var a, conf, utils;
- a = this.a;
- conf = this.a.conf;
- utils = this.a.drawing.EdgeUtils;
- return edge.each(function(d) {
- var curve, curviness, edgeWalk, endx, endy, g, midpoint, startx, starty;
- edgeWalk = utils.edgeWalk(d);
- curviness = conf.curvedEdges ? 30 : 0;
- curve = curviness / 10;
- startx = d.source.radius + (d["stroke-width"] / 2);
- starty = curviness / 10;
- midpoint = edgeWalk.edgeLength / 2;
- endx = edgeWalk.edgeLength - (d.target.radius - (d.target["stroke-width"] / 2));
- endy = curviness / 10;
- g = d3.select(this);
- g.style(utils.edgeStyle(d));
- g.attr('transform', "translate(" + d.source.x + ", " + d.source.y + ") rotate(" + edgeWalk.edgeAngle + ")");
- g.select('.edge-line').attr('d', (function() {
- var arrow, line, w;
- line = "M" + startx + "," + starty + "q" + midpoint + "," + curviness + " " + endx + "," + endy;
- if (conf.directedEdges) {
- w = d["stroke-width"] * 2;
- arrow = "l" + (-w) + "," + (w + curve) + " l" + w + "," + (-w - curve) + " l" + (-w) + "," + (-w + curve);
- return line + arrow;
- }
- return line;
- })());
- return g.select('.edge-handler').attr('d', function(d) {
- return g.select('.edge-line').attr('d');
- });
- });
- },
- classEdge: function(edge) {
- return edge.classed('active', true);
- },
- styleText: function(edge) {
- var conf, curved, utils;
- conf = this.a.conf;
- curved = conf.curvedEdges;
- utils = this.a.drawing.EdgeUtils;
- return edge.select('text').each(function(d) {
- var dx, edgeWalk;
- edgeWalk = utils.edgeWalk(d);
- dx = edgeWalk.edgeLength / 2;
- return d3.select(this).attr('dx', "" + dx).text(d.caption).attr("xlink:xlink:href", "#path-" + d.source.id + "-" + d.target.id).style("display", function(d) {
- if (conf.edgeCaptionsOnByDefault) {
- return "block";
- }
- });
- });
- },
- setInteractions: function(edge) {
- var interactions;
- interactions = this.a.interactions;
- return edge.select('.edge-handler').on('click', interactions.edgeClick).on('mouseover', function(d) {
- return interactions.edgeMouseOver(d);
- }).on('mouseout', function(d) {
- return interactions.edgeMouseOut(d);
- });
- }
- };
- };
-
- DrawEdges = function(instance) {
- return {
- a: instance,
- createEdge: function(d3Edges) {
- var drawEdge, edge;
- drawEdge = this.a.drawing.DrawEdge;
- edge = this.a.vis.selectAll("g.edge").data(d3Edges);
- edge.enter().append('g').attr("id", function(d) {
- return "edge-" + d.id + "-" + d.pos;
- }).attr('class', function(d) {
- return "edge " + d.edgeType;
- }).attr('source-target', function(d) {
- return "" + d.source.id + "-" + d.target.id;
- });
- drawEdge.createLink(edge);
- drawEdge.classEdge(edge);
- drawEdge.styleLink(edge);
- drawEdge.styleText(edge);
- drawEdge.setInteractions(edge);
- edge.exit().remove();
- if (this.a.conf.directedEdges && this.a.conf.curvedEdges) {
- return edge.select('.edge-line').attr('marker-end', 'url(#arrow)');
- }
- },
- updateEdge: function(d3Edge) {
- var drawEdge, edge;
- drawEdge = this.a.drawing.DrawEdge;
- edge = this.a.vis.select("#edge-" + d3Edge.id + "-" + d3Edge.pos);
- drawEdge.classEdge(edge);
- drawEdge.styleLink(edge);
- drawEdge.styleText(edge);
- return drawEdge.setInteractions(edge);
- }
- };
- };
-
- DrawNode = function(instance) {
- return {
- a: instance,
- styleText: function(node) {
- var conf, nodes, utils;
- conf = this.a.conf;
- utils = this.a.drawing.NodeUtils;
- nodes = this.a._nodes;
- return node.selectAll("text").attr('dy', function(d) {
- if (nodes[d.id].getProperties().root) {
- return conf.rootNodeRadius / 2;
- } else {
- return conf.nodeRadius * 2 - 5;
- }
- }).attr('visibility', function(d) {
- if (nodes[d.id]._state === "hidden") {
- return "hidden";
- } else {
- return "visible";
- }
- }).text(function(d) {
- return utils.nodeText(d);
- }).style("display", function(d) {
- if (conf.nodeCaptionsOnByDefault) {
- return "block";
- }
- });
- },
- createNode: function(node) {
- node = _.difference(node, node.select("circle").data());
- node.__proto__ = d3.select().__proto__;
- node.append('circle').attr('id', function(d) {
- return "circle-" + d.id;
- });
- return node.append('svg:text').attr('id', function(d) {
- return "text-" + d.id;
- });
- },
- styleNode: function(node) {
- var utils;
- utils = this.a.drawing.NodeUtils;
- return node.selectAll('circle').attr('r', function(d) {
- if (typeof d.radius === "function") {
- return d.radius();
- } else {
- return d.radius;
- }
- }).each(function(d) {
- return d3.select(this).style(utils.nodeStyle(d));
- });
- },
- setInteractions: function(node) {
- var conf, coreInteractions, drag, editorEnabled, editorInteractions, nonRootNodes, rootNodes;
- conf = this.a.conf;
- coreInteractions = this.a.interactions;
- editorEnabled = this.a.get.state("interactions") === "editor";
- drag = d3.behavior.drag().origin(Object).on("dragstart", null).on("drag", null).on("dragend", null);
- if (editorEnabled) {
- editorInteractions = new this.a.editor.Interactions;
- return node.on('mouseup', function(d) {
- return editorInteractions.nodeMouseUp(d);
- }).on('mouseover', function(d) {
- return editorInteractions.nodeMouseOver(d);
- }).on('mouseout', function(d) {
- return editorInteractions.nodeMouseOut(d);
- }).on('dblclick', function(d) {
- return coreInteractions.nodeDoubleClick(d);
- }).on('click', function(d) {
- return editorInteractions.nodeClick(d);
- });
- } else {
- node.on('mouseup', null).on('mouseover', function(d) {
- return coreInteractions.nodeMouseOver(d);
- }).on('mouseout', function(d) {
- return coreInteractions.nodeMouseOut(d);
- }).on('dblclick', function(d) {
- return coreInteractions.nodeDoubleClick(d);
- }).on('click', function(d) {
- return coreInteractions.nodeClick(d);
- });
- drag = d3.behavior.drag().origin(Object).on("dragstart", coreInteractions.nodeDragStarted).on("drag", coreInteractions.nodeDragged).on("dragend", coreInteractions.nodeDragended);
- if (!conf.fixNodes) {
- nonRootNodes = node.filter(function(d) {
- return d.root !== true;
- });
- nonRootNodes.call(drag);
- }
- if (!conf.fixRootNodes) {
- rootNodes = node.filter(function(d) {
- return d.root === true;
- });
- return rootNodes.call(drag);
- }
- }
- }
- };
- };
-
- DrawNodes = function(instance) {
- return {
- a: instance,
- createNode: function(d3Nodes) {
- var drawNode, node;
- drawNode = this.a.drawing.DrawNode;
- node = this.a.vis.selectAll("g.node").data(d3Nodes, function(n) {
- return n.id;
- });
- node.enter().append("g").attr("class", function(d) {
- var nodeType;
- nodeType = d.self._nodeType;
- return "node " + nodeType + " active";
- }).attr('id', function(d) {
- return "node-" + d.id;
- }).classed('root', function(d) {
- return d.root;
- });
- drawNode.createNode(node);
- drawNode.styleNode(node);
- drawNode.styleText(node);
- drawNode.setInteractions(node);
- return node.exit().remove();
- },
- updateNode: function(alchemyNode) {
- var drawNode, node;
- drawNode = this.a.drawing.DrawNode;
- node = this.a.vis.select("#node-" + alchemyNode.id);
- drawNode.styleNode(node);
- drawNode.styleText(node);
- return drawNode.setInteractions(node);
- }
- };
- };
-
- Alchemy.prototype.EdgeUtils = function(instance) {
- return {
- a: instance,
- edgeStyle: function(d) {
- var clustering, conf, edge, nodes, styles;
- conf = this.a.conf;
- edge = this.a._edges[d.id][d.pos];
- styles = this.a.svgStyles.edge.update(edge);
- nodes = this.a._nodes;
- if (this.a.conf.cluster) {
- clustering = this.a.layout._clustering;
- styles.stroke = (function(d) {
- var clusterKey, gid, id, index, source, target;
- clusterKey = conf.clusterKey;
- source = nodes[d.source.id]._properties;
- target = nodes[d.target.id]._properties;
- if (source.root || target.root) {
- index = source.root ? target[clusterKey] : source[clusterKey];
- return "" + (clustering.getClusterColour(index));
- } else if (source[clusterKey] === target[clusterKey]) {
- index = source[clusterKey];
- return "" + (clustering.getClusterColour(index));
- } else if (source[clusterKey] !== target[clusterKey]) {
- id = "" + source[clusterKey] + "-" + target[clusterKey];
- gid = "cluster-gradient-" + id;
- return "url(#" + gid + ")";
- }
- })(d);
- }
- return styles;
- },
- triangle: function(edge) {
- var height, hyp, width;
- width = edge.target.x - edge.source.x;
- height = edge.target.y - edge.source.y;
- hyp = Math.sqrt(height * height + width * width);
- return [width, height, hyp];
- },
- edgeWalk: function(edge) {
- var curveOffset, edgeLength, edgeWidth, height, hyp, startPathX, width, _ref;
- _ref = this.triangle(edge), width = _ref[0], height = _ref[1], hyp = _ref[2];
- edgeWidth = edge['stroke-width'];
- curveOffset = 2;
- startPathX = edge.source.radius + edge.source['stroke-width'] - (edgeWidth / 2) + curveOffset;
- edgeLength = hyp - startPathX - curveOffset * 1.5;
- return {
- edgeAngle: Math.atan2(height, width) / Math.PI * 180,
- edgeLength: edgeLength
- };
- },
- middleLine: function(edge) {
- return this.curvedDirectedEdgeWalk(edge, 'middle');
- },
- startLine: function(edge) {
- return this.curvedDirectedEdgeWalk(edge, 'linkStart');
- },
- endLine: function(edge) {
- return this.curvedDirectedEdgeWalk(edge, 'linkEnd');
- },
- edgeLength: function(edge) {
- var height, hyp, width;
- width = edge.target.x - edge.source.x;
- height = edge.target.y - edge.source.y;
- return hyp = Math.sqrt(height * height + width * width);
- },
- edgeAngle: function(edge) {
- var height, width;
- width = edge.target.x - edge.source.x;
- height = edge.target.y - edge.source.y;
- return Math.atan2(height, width) / Math.PI * 180;
- },
- captionAngle: function(angle) {
- if (angle < -90 || angle > 90) {
- return 180;
- } else {
- return 0;
- }
- },
- middlePath: function(edge) {
- var midPoint, pathNode;
- pathNode = this.a.vis.select("#path-" + edge.id).node();
- midPoint = pathNode.getPointAtLength(pathNode.getTotalLength() / 2);
- return {
- x: midPoint.x,
- y: midPoint.y
- };
- },
- middlePathCurve: function(edge) {
- var midPoint, pathNode;
- pathNode = d3.select("#path-" + edge.id).node();
- midPoint = pathNode.getPointAtLength(pathNode.getTotalLength() / 2);
- return {
- x: midPoint.x,
- y: midPoint.y
- };
- }
- };
- };
-
- Alchemy.prototype.NodeUtils = function(instance) {
- var a;
- a = instance;
- return {
- nodeStyle: function(d) {
- var conf, node;
- conf = a.conf;
- node = d.self;
- if (conf.cluster && (node._state !== "hidden")) {
- d.fill = (function(d) {
- var clusterMap, clustering, colour, colourIndex, colours, key, nodeProp;
- clustering = a.layout._clustering;
- nodeProp = node.getProperties();
- clusterMap = clustering.clusterMap;
- key = conf.clusterKey;
- colours = conf.clusterColours;
- colourIndex = clusterMap[nodeProp[key]] % colours.length;
- colour = colours[colourIndex];
- return "" + colour;
- })(d);
- d.stroke = d.fill;
- }
- return d;
- },
- nodeText: function(d) {
- var caption, conf, nodeProps;
- conf = a.conf;
- nodeProps = a._nodes[d.id]._properties;
- if (conf.nodeCaption && typeof conf.nodeCaption === 'string') {
- if (nodeProps[conf.nodeCaption] != null) {
- return nodeProps[conf.nodeCaption];
- } else {
- return '';
- }
- } else if (conf.nodeCaption && typeof conf.nodeCaption === 'function') {
- caption = conf.nodeCaption(nodeProps);
- if (caption === void 0 || String(caption) === 'undefined') {
- a.log["caption"] = "At least one caption returned undefined";
- conf.caption = false;
- }
- return caption;
- }
- }
- };
- };
-
- Alchemy.prototype.svgStyles = function(instance) {
- return {
- a: instance,
- node: {
- a: this.a,
- populate: function(node) {
- var conf, d, defaultStyle, fill, nodeType, nodeTypeKey, radius, stroke, strokeWidth, style, svgStyles, toFunc, typedStyle;
- conf = this.a.conf;
- defaultStyle = _.omit(conf.nodeStyle.all, "selected", "highlighted", "hidden");
- d = node;
- toFunc = function(inp) {
- if (typeof inp === "function") {
- return inp;
- }
- return function() {
- return inp;
- };
- };
- nodeTypeKey = _.keys(conf.nodeTypes)[0];
- nodeType = node.getProperties()[nodeTypeKey];
- if (conf.nodeStyle[nodeType] === void 0) {
- nodeType = "all";
- }
- typedStyle = _.assign(_.cloneDeep(defaultStyle), conf.nodeStyle[nodeType]);
- style = _.assign(typedStyle, conf.nodeStyle[nodeType][node._state]);
- radius = toFunc(style.radius);
- fill = toFunc(style.color);
- stroke = toFunc(style.borderColor);
- strokeWidth = toFunc(style.borderWidth);
- svgStyles = {};
- svgStyles["radius"] = radius(d);
- svgStyles["fill"] = fill(d);
- svgStyles["stroke"] = stroke(d);
- svgStyles["stroke-width"] = strokeWidth(d, radius(d));
- return svgStyles;
- }
- },
- edge: {
- a: this.a,
- populate: function(edge) {
- var color, conf, defaultStyle, edgeType, opacity, style, svgStyles, toFunc, typedStyle, width;
- conf = this.a.conf;
- defaultStyle = _.omit(conf.edgeStyle.all, "selected", "highlighted", "hidden");
- toFunc = function(inp) {
- if (typeof inp === "function") {
- return inp;
- }
- return function() {
- return inp;
- };
- };
- edgeType = edge._edgeType;
- if (conf.edgeStyle[edgeType] === void 0) {
- edgeType = "all";
- }
- typedStyle = _.assign(_.cloneDeep(defaultStyle), conf.edgeStyle[edgeType]);
- style = _.assign(typedStyle, conf.edgeStyle[edgeType][edge._state]);
- width = toFunc(style.width);
- color = toFunc(style.color);
- opacity = toFunc(style.opacity);
- svgStyles = {
- "stroke": color(edge),
- "stroke-width": width(edge),
- "opacity": opacity(edge),
- "fill": "none"
- };
- return svgStyles;
- },
- update: function(edge) {
- var color, conf, opacity, style, svgStyles, toFunc, width;
- conf = this.a.conf;
- style = edge._style;
- toFunc = function(inp) {
- if (typeof inp === "function") {
- return inp;
- }
- return function() {
- return inp;
- };
- };
- width = toFunc(style.width);
- color = toFunc(style.color);
- opacity = toFunc(style.opacity);
- svgStyles = {
- "stroke": color(edge),
- "stroke-width": width(edge),
- "opacity": opacity(edge),
- "fill": "none"
- };
- return svgStyles;
- }
- }
- };
- };
-
- Editor = (function() {
- function Editor() {
- this.nodeEditor = __bind(this.nodeEditor, this);
- this.startEditor = __bind(this.startEditor, this);
- this.utils = new alchemy.editor.Utils;
- }
-
- Editor.prototype.editorContainerHTML = "<div id=\"editor-header\" data-toggle=\"collapse\" data-target=\"#editor #element-options\">\n <h3>Editor</h3><span class=\"fa fa-2x fa-caret-right\"></span>\n</div>\n<div id=\"element-options\" class=\"collapse\">\n <ul class=\"list-group\"> \n <li class=\"list-group-item\" id=\"remove\">Remove Selected</li> \n <li class=\"list-group-item\" id=\"editor-interactions\">Editor mode enabled, click to disable editor interactions</li>\n </ul>\n</div>";
-
- Editor.prototype.elementEditorHTML = function(type) {
- return "<h4>" + type + " Editor</h4>\n<form id=\"add-property-form\">\n <div id=\"add-property\">\n <input class=\"form-control\" id=\"add-prop-key\" placeholder=\"New Property Name\">\n <input class=\"form-control\" id=\"add-prop-value\" placeholder=\"New Property Value\">\n </div>\n <input id=\"add-prop-submit\" type=\"submit\" value=\"Add Property\" placeholder=\"add a property to this node\">\n</form>\n<form id=\"properties-list\">\n <input id=\"update-properties\" type=\"submit\" value=\"Update Properties\">\n</form>";
- };
-
- Editor.prototype.startEditor = function() {
- var divSelector, editor, editor_interactions, html, utils;
- divSelector = alchemy.conf.divSelector;
- html = this.editorContainerHTML;
- editor = alchemy.dash.select("#control-dash").append("div").attr("id", "editor").html(html);
- editor.select('#editor-header').on('click', function() {
- if (alchemy.dash.select('#element-options').classed("in")) {
- return alchemy.dash.select("#editor-header>span").attr("class", "fa fa-2x fa-caret-right");
- } else {
- return alchemy.dash.select("#editor-header>span").attr("class", "fa fa-2x fa-caret-down");
- }
- });
- editor_interactions = editor.select('#element-options ul #editor-interactions').on('click', function() {
- return d3.select(this).attr("class", function() {
- if (alchemy.get.state() === 'editor') {
- alchemy.set.state('interactions', 'default');
- return "inactive list-group-item";
- } else {
- alchemy.set.state('interactions', 'editor');
- return "active list-group-item";
- }
- }).html(function() {
- if (alchemy.get.state() === 'editor') {
- return "Disable Editor Interactions";
- } else {
- return "Enable Editor Interactions";
- }
- });
- });
- editor.select("#element-options ul #remove").on("click", function() {
- return alchemy.editor.remove();
- });
- utils = this.utils;
- return editor_interactions.on("click", function() {
- if (!alchemy.dash.select("#editor-interactions").classed("active")) {
- utils.enableEditor();
- return alchemy.dash.select("#editor-interactions").classed({
- "active": true,
- "inactive": false
- }).html("Editor mode enabled, click to disable editor interactions");
- } else {
- utils.disableEditor();
- return alchemy.dash.select("#editor-interactions").classed({
- "active": false,
- "inactive": true
- }).html("Editor mode disabled, click to enable editor interactions");
- }
- });
- };
-
- Editor.prototype.nodeEditor = function(n) {
- var add_property, divSelector, editor, elementEditor, html, nodeProperties, node_property, options, property, property_list, updateProperty, val;
- divSelector = alchemy.conf.divSelector;
- editor = alchemy.dash.select("#control-dash #editor");
- options = editor.select('#element-options');
- html = this.elementEditorHTML("Node");
- elementEditor = options.append('div').attr('id', 'node-editor').html(html);
- elementEditor.attr("class", function() {
- var active;
- active = alchemy.dash.select("#editor-interactions").classed("active");
- if (active) {
- return "enabled";
- }
- return "hidden";
- });
- add_property = editor.select("#node-editor form #add-property");
- add_property.select("#node-add-prop-key").attr("placeholder", "New Property Name").attr("value", null);
- add_property.select("#node-add-prop-value").attr("placeholder", "New Property Value").attr("value", null);
- alchemy.dash.select("#add-property-form").on("submit", function() {
- var key, value;
- event.preventDefault();
- key = alchemy.dash.select('#add-prop-key').property('value');
- key = key.replace(/\s/g, "_");
- value = alchemy.dash.select('#add-prop-value').property('value');
- updateProperty(key, value, true);
- alchemy.dash.selectAll("#add-property .edited-property").classed({
- "edited-property": false
- });
- return this.reset();
- });
- nodeProperties = alchemy._nodes[n.id].getProperties();
- alchemy.vis.select("#node-" + n.id).classed({
- "editing": true
- });
- property_list = editor.select("#node-editor #properties-list");
- for (property in nodeProperties) {
- val = nodeProperties[property];
- node_property = property_list.append("div").attr("id", "node-" + property).attr("class", "property form-inline form-group");
- node_property.append("label").attr("for", "node-" + property + "-input").attr("class", "form-control property-name").text("" + property);
- node_property.append("input").attr("id", "node-" + property + "-input").attr("class", "form-control property-value").attr("value", "" + val);
- }
- alchemy.dash.select("#properties-list").on("submit", function() {
- var key, properties, selection, value, _i, _len, _ref;
- event.preventDefault();
- properties = alchemy.dash.selectAll(".edited-property");
- _ref = properties[0];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- property = _ref[_i];
- selection = alchemy.dash.select(property);
- key = selection.select("label").text();
- value = selection.select("input").attr('value');
- updateProperty(key, value, false);
- }
- alchemy.dash.selectAll("#node-properties-list .edited-property").classed({
- "edited-property": false
- });
- return this.reset();
- });
- d3.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown", function() {
- if (d3.event.keyCode === 13) {
- event.preventDefault();
- }
- return d3.select(this).classed({
- "edited-property": true
- });
- });
- return updateProperty = function(key, value, newProperty) {
- var drawNodes, nodeID;
- nodeID = n.id;
- if ((key !== "") && (value !== "")) {
- alchemy._nodes[nodeID].setProperty("" + key, "" + value);
- drawNodes = alchemy._drawNodes;
- drawNodes.updateNode(alchemy.viz.select("#node-" + nodeID));
- if (newProperty === true) {
- alchemy.dash.select("#node-add-prop-key").attr("value", "property added/updated to key: " + key);
- return alchemy.dash.select("#node-add-prop-value").attr("value", "property at " + key + " updated to: " + value);
- } else {
- return alchemy.dash.select("#node-" + key + "-input").attr("value", "property at " + key + " updated to: " + value);
- }
- } else {
- if (newProperty === true) {
- alchemy.dash.select("#node-add-prop-key").attr("value", "null or invalid input");
- return alchemy.dash.select("#node-add-prop-value").attr("value", "null or invlid input");
- } else {
- return alchemy.dash.select("#node-" + key + "-input").attr("value", "null or invalid input");
- }
- }
- };
- };
-
- Editor.prototype.editorClear = function() {
- alchemy.dash.selectAll(".node").classed({
- "editing": false
- });
- alchemy.dash.selectAll(".edge").classed({
- "editing": false
- });
- alchemy.dash.select("#node-editor").remove();
- alchemy.dash.select("#edge-editor").remove();
- return alchemy.dash.select("#node-add-prop-submit").attr("placeholder", function() {
- if (alchemy.vis.selectAll(".selected").empty()) {
- return "select a node or edge to edit properties";
- }
- return "add a property to this element";
- });
- };
-
- Editor.prototype.edgeEditor = function(e) {
- var add_property, divSelector, edgeProperties, edge_property, editor, elementEditor, html, options, property, property_list, updateProperty, val;
- divSelector = alchemy.conf.divSelector;
- editor = alchemy.dash("#control-dash #editor");
- options = editor.select('#element-options');
- html = this.elementEditorHTML("Edge");
- elementEditor = options.append('div').attr('id', 'edge-editor').html(html);
- elementEditor.attr("class", function() {
- if (alchemy.dash.select("#editor-interactions").classed("active")) {
- return "enabled";
- }
- return "hidden";
- });
- add_property = editor.select("#edge-editor form #add-property");
- add_property.select("#add-prop-key").attr("placeholder", "New Property Name").attr("value", null);
- add_property.select("#add-prop-value").attr("placeholder", "New Property Value").attr("value", null);
- edgeProperties = alchemy._edges[e.id].getProperties();
- alchemy.vis.select("#edge-" + e.id).classed({
- "editing": true
- });
- property_list = editor.select("#edge-editor #properties-list");
- for (property in edgeProperties) {
- val = edgeProperties[property];
- edge_property = property_list.append("div").attr("id", "edge-" + property).attr("class", "property form-inline form-group");
- edge_property.append("label").attr("for", "edge-" + property + "-input").attr("class", "form-control property-name").text("" + property);
- edge_property.append("input").attr("id", "edge-" + property + "-input").attr("class", "form-control property-value").attr("value", "" + val);
- }
- alchemy.dash.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown", function() {
- if (d3.event.keyCode === 13) {
- event.preventDefault();
- }
- return d3.select(this).classed({
- "edited-property": true
- });
- });
- alchemy.dash.select("#add-property-form").on("submit", function() {
- var key, value;
- event.preventDefault();
- key = alchemy.dash.select("#add-prop-key").property('value');
- key = key.replace(/\s/g, "_");
- value = alchemy.dash.select("#add-prop-value").property('value');
- updateProperty(key, value, true);
- alchemy.dash.selectAll("#add-property .edited-property").classed({
- "edited-property": false
- });
- return this.reset();
- });
- d3.select("#properties-list").on("submit", function() {
- var key, properties, selection, value, _i, _len, _ref;
- event.preventDefault();
- propertie
<TRUNCATED>
[21/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiNotFoundException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiNotFoundException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiNotFoundException.java
deleted file mode 100644
index 6b1e77a..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiNotFoundException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-public class ScimpiNotFoundException extends ScimpiException {
- public ScimpiNotFoundException() {
- super();
- }
-
- public ScimpiNotFoundException(final String message, final Throwable cause) {
- super(message, cause);
- }
-
- public ScimpiNotFoundException(final String message) {
- super(message);
- }
-
- public ScimpiNotFoundException(final Throwable cause) {
- super(cause);
- }
-
- private static final long serialVersionUID = 1L;
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/TagOrderException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/TagOrderException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/TagOrderException.java
deleted file mode 100644
index 97e00e4..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/TagOrderException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class TagOrderException extends ScimpiException {
- private static final long serialVersionUID = 1L;
-
- public TagOrderException(final Request request) {
- super("Invalid tag in this context: " + request.getTag().getName());
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/UserManager.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/UserManager.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/UserManager.java
deleted file mode 100644
index cdb1b04..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/UserManager.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.authentication.AnonymousSession;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.runtime.authentication.AuthenticationManager;
-import org.apache.isis.core.runtime.authentication.AuthenticationRequestPassword;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-
-public class UserManager {
-
- private static final Logger LOG = LoggerFactory.getLogger(UserManager.class);
- private static UserManager instance;
-
- private static AuthenticationManager getAuthenticationManager() {
- if (instance == null) {
- throw new IllegalStateException("Server initialisation failed, or not defined as a context listener");
- }
- return instance.authenticationManager;
- }
-
- public static AuthenticationSession startRequest(final RequestContext context) {
- AuthenticationSession session = context.getSession();
- if (session == null) {
- session = new AnonymousSession();
- LOG.debug("start anonymous request: " + session);
- } else {
- LOG.debug("start request for: " + session.getUserName());
- }
- IsisContext.closeSession();
- IsisContext.openSession(session);
- return session;
- }
-
- public static AuthenticationSession authenticate(final AuthenticationRequestPassword passwordAuthenticationRequest) {
- final AuthenticationSession session = getAuthenticationManager().authenticate(passwordAuthenticationRequest);
- if (session != null) {
- LOG.info("log on user " + session.getUserName());
- IsisContext.closeSession();
- IsisContext.openSession(session);
- }
- return session;
- }
-
- public static void endRequest(final AuthenticationSession session) {
- if (session == null) {
- LOG.debug("end anonymous request");
- } else {
- LOG.debug("end request for: " + session.getUserName());
- }
- IsisContext.closeSession();
- }
-
- public static void logoffUser(final AuthenticationSession session) {
- LOG.info("log off user " + session.getUserName());
- IsisContext.closeSession();
- getAuthenticationManager().closeSession(session);
-
- final AnonymousSession replacementSession = new AnonymousSession();
- IsisContext.openSession(replacementSession);
- }
-
- private final AuthenticationManager authenticationManager;
-
- public UserManager(final AuthenticationManager authenticationManager) {
- this.authenticationManager = authenticationManager;
- UserManager.instance = this;
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Util.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Util.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Util.java
deleted file mode 100644
index b485dd0..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Util.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import java.text.DateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.TimeZone;
-
-class Util {
-
- public static final String DEFAULT_TIME_ZONE = "Europe/London";
- public static final String DEFAULT_LANGUAGE = "English, United Kingdom (en-gb)";
-
-
- private Util() {}
-
- public static boolean hasChanged(String version1, String version2) {
- return version2 == null && version1 != null || (version2 != null && !version2.equals(version1));
- }
-
- public static List<String> languages() {
- Locale[] locales = DateFormat.getAvailableLocales();
- List<String> list = new ArrayList<String>(locales.length);
- for (Locale locale : locales) {
- list.add(localeName(locale));
- }
- Collections.sort(list);
- return list;
- }
-
- public static List<String> timeZones() {
- List<String> timezones = Arrays.asList(TimeZone.getAvailableIDs());
- Collections.sort(timezones);
- return timezones;
- }
-
- public static TimeZone timeZone(String timeZoneEntry) {
- TimeZone timeZone = TimeZone.getTimeZone(timeZoneEntry);
- return timeZone;
- }
-
- public static Locale locale(String localeCode) {
- String substring[] = localeCode.trim().split("-");
- Locale locale;
- switch (substring.length) {
- case 1:
- locale = new Locale(substring[0]);
- break;
- case 2:
- locale = new Locale(substring[0], substring[1]);
- break;
- case 3:
- locale = new Locale(substring[0], substring[1], substring[3]);
- break;
- default:
- locale = Locale.getDefault();
- break;
- }
- return locale;
- }
-
- public static String languageName(String languageCode) {
- Locale locale = locale(languageCode);
- return localeName(locale);
- }
-
- public static String codeForLanguage(String language) {
- Locale[] locales = DateFormat.getAvailableLocales();
- for (Locale locale : locales) {
- String name = localeName(locale);
- if (name.equals(language)) {
- return locale.toString().toLowerCase().replace('_', '-');
- }
- }
- return null;
- }
-
- public static String localeName(Locale locale) {
- String language = locale.getDisplayLanguage();
- String country = locale.getDisplayCountry().length() == 0 ? "" : ", " + (locale.getDisplayCountry());
- return language + country + " (" + locale.toString().toLowerCase().replace('_', '-') + ")";
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java
deleted file mode 100644
index 44a9756..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.action;
-
-import java.io.IOException;
-import java.util.List;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.commons.authentication.AnonymousSession;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
-import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.Veto;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.Action;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-public class ActionAction implements Action {
-
- public static final String ACTION = "action";
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- public String getName() {
- return ACTION;
- }
-
- /**
- * REVIEW - this and EditAction are very similar - refactor out common code.
- */
- @Override
- public void process(final RequestContext context) throws IOException {
- final String objectId = context.getParameter("_" + OBJECT);
- final String version = context.getParameter("_" + VERSION);
- final String formId = context.getParameter("_" + FORM_ID);
- final String methodName = context.getParameter("_" + METHOD);
- final String override = context.getParameter("_" + RESULT_OVERRIDE);
- String resultName = context.getParameter("_" + RESULT_NAME);
- final String message = context.getParameter("_" + MESSAGE);
- resultName = resultName == null ? RequestContext.RESULT : resultName;
-
- FormState entryState = null;
- try {
- final ObjectAdapter object = MethodsUtils.findObject(context, objectId);
- // FIXME need to find method based on the set of parameters.
- // otherwise overloaded method may be incorrectly
- // selected.
- final ObjectAction action = MethodsUtils.findAction(object, methodName);
- entryState = validateParameters(context, action, object);
-
- AuthenticationSession session = context.getSession();
- if (session == null && action.isVisible(new AnonymousSession(), object, where).isVetoed()) {
- session = new AnonymousSession();
- }
-
- final Version originalVersion = context.getVersion(version);
- object.checkLock(originalVersion);
- if (entryState.isValid()) {
- final boolean hasResult = invokeMethod(context, resultName, object, action, entryState);
- String view = context.getParameter(hasResult ? "_" + VIEW : "_" + VOID);
-
- final int questionMark = view == null ? -1 : view.indexOf("?");
- if (questionMark > -1) {
- final String params[] = view.substring(questionMark + 1).split("&");
- for (final String param : params) {
- final int equals = param.indexOf("=");
- context.addVariable(param.substring(0, equals), param.substring(equals + 1), Scope.REQUEST);
- view = view.substring(0, questionMark);
- }
- }
- context.setRequestPath(view);
- if (message != null) {
- final MessageBroker messageBroker = getMessageBroker();
- messageBroker.addMessage(message);
- }
- if (override != null) {
- context.addVariable(resultName, override, Scope.REQUEST);
- }
- if (!action.hasReturn() && context.getVariable(resultName) == null) {
- context.addVariable(resultName, objectId, Scope.REQUEST);
- }
- } else {
- entryState.setForm(formId);
- context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
- context.addVariable(resultName, objectId, Scope.REQUEST);
- if (override != null) {
- context.addVariable(resultName, override, Scope.REQUEST);
- }
- final String error = entryState.getError();
- final String view = context.getParameter("_" + ERROR);
- context.setRequestPath(view, Dispatcher.ACTION);
-
- final MessageBroker messageBroker = getMessageBroker();
- messageBroker.addWarning(error);
- }
- } catch (final ConcurrencyException e) {
- final ObjectAdapter adapter = getAdapterManager().getAdapterFor(e.getOid());
- String user = adapter.getOid().getVersion().getUser();
- String errorMessage = "The data for '" + adapter.titleString() + "' was changed by " + user
- + ". Please repeat the action based on those changes.";
- getMessageBroker().addMessage(errorMessage);
-
- entryState.setForm(formId);
- context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
- context.addVariable(resultName, objectId, Scope.REQUEST);
- if (override != null) {
- context.addVariable(resultName, override, Scope.REQUEST);
- }
- final String error = entryState.getError();
- if (error != null) {
- context.addVariable(RequestContext.ERROR, error, Scope.REQUEST);
- }
-
- final String view = context.getParameter("_" + ERROR);
- context.setRequestPath(view, Dispatcher.ACTION);
-
- } catch (final RuntimeException e) {
- getMessageBroker().getMessages();
- getMessageBroker().getWarnings();
- throw e;
- }
- }
-
- private boolean invokeMethod(final RequestContext context, final String variable, final ObjectAdapter object, final ObjectAction action, final FormState entryState) {
-
- final ObjectAdapter[] parameters = getParameters(action, entryState);
- final String scopeName = context.getParameter("_" + SCOPE);
- final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
- return MethodsUtils.runMethod(context, action, object, parameters, variable, scope);
- }
-
- private ObjectAdapter[] getParameters(final ObjectAction action, final FormState entryState) {
- final int parameterCount = action.getParameterCount();
- final ObjectAdapter[] parameters = new ObjectAdapter[parameterCount];
- for (int i = 0; i < parameterCount; i++) {
- parameters[i] = entryState.getField(parameterName(i)).getValue();
- }
- return parameters;
- }
-
- private FormState validateParameters(final RequestContext context, final ObjectAction action, final ObjectAdapter object) {
- final FormState formState = new FormState();
- final List<ObjectActionParameter> parameters2 = action.getParameters();
- final int parameterCount = action.getParameterCount();
- for (int i = 0; i < parameterCount; i++) {
- final String fieldName = parameterName(i);
- String newEntry = context.getParameter(fieldName);
-
- if (newEntry != null && newEntry.equals("-OTHER-")) {
- newEntry = context.getParameter(fieldName + "-other");
- }
-
- if (newEntry == null) {
- // TODO figure out a better way to determine if boolean or a
- // password
- final ObjectSpecification spec = parameters2.get(i).getSpecification();
- if (spec.isOfType(IsisContext.getSpecificationLoader().loadSpecification(boolean.class)) || spec.isOfType(IsisContext.getSpecificationLoader().loadSpecification(Boolean.class))) {
- newEntry = FALSE;
- } else {
- newEntry = "";
- }
- }
- final FieldEditState fieldState = formState.createField(fieldName, newEntry);
- Consent consent = null;
-
- if (!parameters2.get(i).isOptional() && newEntry.equals("")) {
- consent = new Veto(parameters2.get(i).getName() + " required");
- formState.setError("Not all fields have been set");
-
- } else if (parameters2.get(i).getSpecification().getFacet(ParseableFacet.class) != null) {
- try {
- final ParseableFacet facet = parameters2.get(i).getSpecification().getFacet(ParseableFacet.class);
- Localization localization = IsisContext.getLocalization();
- final String message = parameters2.get(i).isValid(object, newEntry, localization);
- if (message != null) {
- consent = new Veto(message);
- formState.setError("Not all fields are valid");
- }
- final ObjectAdapter entry = facet.parseTextEntry(null, newEntry, localization);
- fieldState.setValue(entry);
- } catch (final TextEntryParseException e) {
- consent = new Veto(e.getMessage());
- formState.setError("Not all fields are valid");
- }
- } else {
- fieldState.setValue(newEntry == null ? null : context.getMappedObject(newEntry));
- }
- if (consent != null && consent.isVetoed()) {
- fieldState.setError(consent.getReason());
- }
- }
-
- if (formState.isValid()) {
- final ObjectAdapter[] parameters = getParameters(action, formState);
- final Consent consent = action.isProposedArgumentSetValid(object, parameters);
- if (consent != null && consent.isVetoed()) {
- formState.setError(consent.getReason());
- }
- }
-
- return formState;
- }
-
- public static String parameterName(final int index) {
- return PARAMETER + (index + 1);
- }
-
- @Override
- public void init() {
- }
-
- @Override
- public void debug(final DebugBuilder debug) {
- }
-
-
- ///////////////////////////////////////////////////////////////////////////
- // from context
- ///////////////////////////////////////////////////////////////////////////
-
- protected MessageBroker getMessageBroker() {
- return IsisContext.getMessageBroker();
- }
-
- protected AdapterManager getAdapterManager() {
- return IsisContext.getPersistenceSession().getAdapterManager();
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/Attributes.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/Attributes.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/Attributes.java
deleted file mode 100644
index 67d13e2..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/Attributes.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.action;
-
-import java.util.Enumeration;
-import java.util.Vector;
-
-import org.htmlparser.Attribute;
-import org.htmlparser.nodes.TagNode;
-
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-
-public class Attributes {
- private static final String TRUE = " true yes on ";
- private static final String FALSE = " false no off ";
- private final TagNode tagNode;
- private final RequestContext context;
-
- public Attributes(final TagNode tagNode, final RequestContext context) {
- this.tagNode = tagNode;
- this.context = context;
- }
-
- public boolean isPropertySet(final String name) {
- final String attribute = tagNode.getAttribute(name);
- int end = attribute.length() - 1;
- final int pos = attribute.indexOf(':');
- end = pos == -1 ? end : pos;
- final String variabelName = attribute.substring(2, end);
- final Object value = context.getVariable(variabelName);
- return value != null;
- // return attribute != null &&
- // !context.replaceVariables(attribute).equals("");
- }
-
- public boolean isPropertySpecified(final String name) {
- final String attribute = tagNode.getAttribute(name);
- return attribute != null;
- }
-
- public String getOptionalProperty(final String name, final boolean ensureVariablesExists) {
- return getOptionalProperty(name, null, ensureVariablesExists);
- }
-
- public String getOptionalProperty(final String name, final String defaultValue, final boolean ensureVariablesExists) {
- final String attribute = tagNode.getAttribute(name);
- return attribute == null ? defaultValue : context.replaceVariables(attribute);
- }
-
- public String getRequiredProperty(final String name, final boolean ensureVariablesExists) {
- final String attribute = tagNode.getAttribute(name);
- if (attribute == null) {
- throw new RequiredPropertyException("Missing property: " + name);
- } else if (attribute.equals("")) {
- throw new RequiredPropertyException("Property not set: " + name);
- } else {
- return context.replaceVariables(attribute);
- }
- }
-
- public String[] getPropertyNames(final String excluding[]) {
- final Vector attributes = tagNode.getAttributesEx();
- final String[] names = new String[attributes.size()];
- int i = 0;
- names: for (final Enumeration e = attributes.elements(); e.hasMoreElements();) {
- final String name = ((Attribute) e.nextElement()).getName();
- if (name == null) {
- continue;
- }
- for (int j = 0; j < excluding.length; j++) {
- if (name.equals(excluding[j])) {
- continue names;
- }
- }
- if (tagNode.getAttribute(name) != null) {
- names[i++] = name;
- }
- }
-
- final String[] array = new String[i];
- System.arraycopy(names, 0, array, 0, i);
- return array;
- }
-
- @Override
- public String toString() {
- return tagNode.toHtml(); // getAttributesEx().toString();
- }
-
- public boolean isRequested(final String name) {
- return isRequested(name, false);
- }
-
- public boolean isRequested(final String name, final boolean defaultValue) {
- final String flag = getOptionalProperty(name, true);
- if (flag == null) {
- return defaultValue;
- } else {
- return isTrue(flag);
- }
- }
-
- public static boolean isTrue(final String flag) {
- final String value = " " + flag.toLowerCase().trim() + " ";
- if (TRUE.indexOf(value) >= 0) {
- return true;
- } else if (FALSE.indexOf(value) >= 0) {
- return false;
- } else {
- throw new PropertyException("Illegal flag value: " + flag);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/PropertyException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/PropertyException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/PropertyException.java
deleted file mode 100644
index 2e42188..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/PropertyException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.action;
-
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-
-public class PropertyException extends ScimpiException {
-
- private static final long serialVersionUID = 1L;
-
- public PropertyException() {
- super();
- }
-
- public PropertyException(final String message, final Throwable cause) {
- super(message, cause);
- }
-
- public PropertyException(final String message) {
- super(message);
- }
-
- public PropertyException(final Throwable cause) {
- super(cause);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/RequiredPropertyException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/RequiredPropertyException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/RequiredPropertyException.java
deleted file mode 100644
index 20430d3..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/RequiredPropertyException.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.action;
-
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-
-public class RequiredPropertyException extends ScimpiException {
- private static final long serialVersionUID = 1L;
-
- public RequiredPropertyException() {
- super();
- }
-
- public RequiredPropertyException(final String message, final Throwable cause) {
- super(message, cause);
- }
-
- public RequiredPropertyException(final String message) {
- super(message);
- }
-
- public RequiredPropertyException(final Throwable cause) {
- super(cause);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java
deleted file mode 100644
index 85d0f02..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.context;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.oid.AggregatedOid;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-
-public class DefaultOidObjectMapping implements ObjectMapping {
-
- private static final Logger LOG = LoggerFactory.getLogger(DefaultOidObjectMapping.class);
-
- private final Map<String, TransientRootAdapterMapping> requestTransients = Maps.newHashMap();
- private final Map<String, TransientRootAdapterMapping> sessionTransients = Maps.newHashMap();
-
- //private Class<? extends Oid> oidType;
-
-
- ///////////////////////////////////////
- // clear, endSession
- ///////////////////////////////////////
-
- @Override
- public void clear() {
- requestTransients.clear();
-
- final List<String> remove = Lists.newArrayList();
- for (final String id : sessionTransients.keySet()) {
- final Oid oid = sessionTransients.get(id).getOid();
- if (!oid.isTransient()) {
- remove.add(id);
- sessionTransients.put(id, null);
- }
- }
- for (final String id : remove) {
- sessionTransients.remove(id);
- }
- }
-
- @Override
- public void endSession() {
- sessionTransients.clear();
- }
-
-
- ///////////////////////////////////////
- // mapTransientObject
- ///////////////////////////////////////
-
- @Override
- public String mapTransientObject(final ObjectAdapter adapter) {
- try {
- final List<ObjectAdapter> savedObject = Lists.newArrayList();
- final JSONObject data = encodeTransientData(adapter, savedObject);
- return RequestContext.TRANSIENT_OBJECT_OID_MARKER + data.toString(4);
- } catch (final JSONException e) {
- throw new ScimpiException(e);
- }
- }
-
- private JSONObject encodeTransientData(final ObjectAdapter adapter, final List<ObjectAdapter> adaptersToSave) throws JSONException {
- if (adaptersToSave.contains(adapter)) {
- return null;
- }
- adaptersToSave.add(adapter);
-
- final JSONObject data = createJsonForAdapter(adapter);
-
- final ObjectSpecification specification = adapter.getSpecification();
- for (final ObjectAssociation association : specification.getAssociations(Contributed.EXCLUDED)) {
- final ObjectAdapter fieldValue = association.get(adapter);
- final String fieldName = association.getId();
-
- if (fieldValue == null) {
- data.put(fieldName, (Object) null);
- } else if (association.getSpecification().isEncodeable()) {
- final EncodableFacet encodeableFacet = fieldValue.getSpecification().getFacet(EncodableFacet.class);
- data.put(fieldName, encodeableFacet.toEncodedString(fieldValue));
-
- } else if (association instanceof OneToManyAssociation) {
- final List<JSONObject> collection = Lists.newArrayList();
- final CollectionFacet facet = fieldValue.getSpecification().getFacet(CollectionFacet.class);
- for (final ObjectAdapter element : facet.iterable(fieldValue)) {
- collection.add(encodeTransientData(element, adaptersToSave));
- }
- data.put(fieldName, collection);
- } else {
- if (fieldValue.isTransient() || fieldValue.isParented()) {
- final JSONObject saveData = encodeTransientData(fieldValue, adaptersToSave);
- if (saveData == null) {
- data.put(fieldName, mapObject(fieldValue, Scope.INTERACTION));
- } else {
- data.put(fieldName, saveData);
- }
- } else {
- data.put(fieldName, mapObject(fieldValue, Scope.INTERACTION));
- }
- }
- }
- return data;
- }
-
- private JSONObject createJsonForAdapter(final ObjectAdapter adapter) throws JSONException {
- final JSONObject data = new JSONObject();
-
- final Oid oid = adapter.getOid();
- data.put("_oid", oid.enString(getOidMarshaller()));
-
- if(oid instanceof RootOid) {
- return data;
- }
-
- if (!(oid instanceof AggregatedOid)) {
- throw new ScimpiException("Unsupported OID type " + oid);
- }
- return data;
- }
-
-
-
-
- ////////////////////////////////////////////////////
- // mapObject (either persistent or transient)
- ////////////////////////////////////////////////////
-
- @Override
- public String mapObject(final ObjectAdapter adapter, final Scope scope) {
-
- // TODO need to ensure that transient objects are remapped each time so
- // that any changes are added to
- // session data
- // continue work here.....here
-
- final Oid oid = adapter.getOid();
-// if (oidType == null) {
-// oidType = oid.getClass();
-// }
-
- String encodedOid = oid.enString(getOidMarshaller());
-
- //final boolean isTransient = adapter.isTransient();
- //final String transferableId = (isTransient ? "T" : "P") + adapter.getSpecification().getFullIdentifier() + "@" + encodedOid;
- final String transferableId = encodedOid;
- // LOG.debug("encoded " + oid + " as " + transferableId + " ~ " + encodedOid);
-
- if (adapter.isTransient()) {
- // old TODO cache these in requests so that Mementos are only created once.
- // old TODO if Transient/Interaction then return state; other store state in session an return OID string
- final TransientRootAdapterMapping mapping = new TransientRootAdapterMapping(adapter);
- mappingFor(scope).put(transferableId, mapping);
- }
-
- return transferableId;
- }
-
- private Map<String, TransientRootAdapterMapping> mappingFor(final Scope scope) {
- if (scope == Scope.REQUEST) {
- return requestTransients;
- }
- if (scope == Scope.INTERACTION || scope == Scope.SESSION) {
- return sessionTransients;
- }
- throw new ScimpiException("Can't hold globally transient object");
- }
-
-
-
- ////////////////////////////////////////////////////
- // mappedTransientObject (lookup)
- ////////////////////////////////////////////////////
-
- @Override
- public ObjectAdapter mappedTransientObject(final String jsonObjectData) {
- final String objectData = jsonObjectData; // StringEscapeUtils.unescapeHtml(data);
- if(LOG.isDebugEnabled()) {
- LOG.debug("data" + objectData);
- }
-
- try {
- final JSONObject jsonObject = new JSONObject(objectData);
- return restoreTransientObject(jsonObject);
- } catch (final JSONException e) {
- throw new ScimpiException("Problem reading data: " + jsonObjectData, e);
- }
- }
-
- private ObjectAdapter restoreTransientObject(final JSONObject jsonObject) throws JSONException {
-
- final ObjectAdapter adapter = getAdapter(jsonObject);
-
- //final String objectType = jsonObject.getString("_objectType");
- //final ObjectSpecification specification = getSpecificationLoader().lookupByObjectType(objectType);
- final ObjectSpecification specification = adapter.getSpecification();
-
- for (final ObjectAssociation association : specification.getAssociations(Contributed.EXCLUDED)) {
- final String fieldName = association.getId();
-
- final Object fieldValue = jsonObject.has(fieldName) ? jsonObject.get(fieldName) : null;
-
- if (association.getSpecification().isEncodeable()) {
- if (fieldValue == null) {
- ((OneToOneAssociation) association).initAssociation(adapter, null);
- } else {
- final EncodableFacet encodeableFacet = association.getSpecification().getFacet(EncodableFacet.class);
- final ObjectAdapter fromEncodedString = encodeableFacet.fromEncodedString((String) fieldValue);
- ((OneToOneAssociation) association).initAssociation(adapter, fromEncodedString);
- }
- } else if (association instanceof OneToManyAssociation) {
- final JSONArray collection = (JSONArray) fieldValue;
- for (int i = 0; i < collection.length(); i++) {
- final JSONObject jsonElement = (JSONObject) collection.get(i);
- final ObjectAdapter objectToAdd = restoreTransientObject(jsonElement);
- ((OneToManyAssociation) association).addElement(adapter, objectToAdd);
- }
-
- /*
- * CollectionFacet facet =
- * fieldValue.getSpecification().getFacet
- * (CollectionFacet.class); for (ObjectAdapter element :
- * facet.iterable(fieldValue)) {
- * collection.add(saveData(element, savedObject)); }
- * data.put(fieldName, collection);
- */
- } else {
- if (fieldValue == null) {
- ((OneToOneAssociation) association).initAssociation(adapter, null);
- } else {
- if (fieldValue instanceof JSONObject) {
- final ObjectAdapter fieldObject = restoreTransientObject((JSONObject) fieldValue);
- ((OneToOneAssociation) association).initAssociation(adapter, fieldObject);
- } else {
- final ObjectAdapter field = mappedObject((String) fieldValue);
- ((OneToOneAssociation) association).initAssociation(adapter, field);
- }
- }
- }
- }
- return adapter;
- }
-
- private ObjectAdapter getAdapter(final JSONObject jsonObject) throws JSONException {
-
- //final String objectType = jsonObject.getString("_objectType");
- //final String id = jsonObject.getString("_id");
- //final ObjectSpecification objectSpec = getSpecificationLoader().lookupByObjectType(objectType);
-
- final String oidStr = jsonObject.getString("_oid");
- final TypedOid typedOid = getOidMarshaller().unmarshal(oidStr, TypedOid.class);
-
- if(!typedOid.isTransient()) {
- return getAdapterManager().adapterFor(typedOid);
- } else {
- return mappedObject(oidStr);
- }
-
-// if (objectSpec.isParented() && !objectSpec.isParentedOrFreeCollection()) {
-// final String[] split = id.split("@");
-// final String parentOidStr = split[0];
-// final String aggregatedLocalId = split[1];
-//
-// RootOid parentOid;
-// if(RootOid.class.isAssignableFrom(oidType)) {
-// parentOid = getOidStringifier().deString(parentOidStr);
-// } else if (RootOidDefault.class.isAssignableFrom(oidType)) {
-// parentOid = RootOidDefault.createTransient(objectType, parentOidStr);
-// } else {
-// // REVIEW: for now, don't support holding references to aggregates whose parent is also an aggregate
-// throw new ScimpiException("Unsupported OID type " + oidType);
-// }
-//
-// final AggregatedOid oid = new AggregatedOid(objectType, parentOid, aggregatedLocalId);
-// return getPersistenceSession().recreateAdapter(oid, objectSpec);
-// } else {
-// return mappedObject("T" + objectType + "@" + id); // yuk!
-// }
- }
-
-
-
- ////////////////////////////////////////////////////
- // mappedObject (lookup - either persistent or transient)
- ////////////////////////////////////////////////////
-
- @Override
- public ObjectAdapter mappedObject(final String oidStr) {
-
- final TypedOid typedOid = getOidMarshaller().unmarshal(oidStr, TypedOid.class);
-
-
-// final char type = oidStr.charAt(0);
-//
-// // Pdom.todo.ToDoItem@OID:TODO:6
-// final String[] split = oidStr.split("@");
-// final String oidData = split[1];
-// final String[] oidDataArray = oidData.split(":");
-// final String objectType = oidDataArray[1];
-// final String aggregatedId = split.length > 2?split[2]:null;
-//
-// final ObjectSpecification spec = getSpecificationLoader().lookupByObjectType(objectType);
-
- //if ((type == 'T')) {
- if (typedOid.isTransient()) {
-
- TransientRootAdapterMapping mapping = sessionTransients.get(oidStr);
- if (mapping == null) {
- mapping = requestTransients.get(oidStr);
- }
- if (mapping == null) {
-
- // create as a (transient) root adapter
- // Oid oid = deString(objectType, oidData, State.TRANSIENT);
- //return getPersistenceSession().recreateAdapter(oid, pojo);
-
- return getAdapterManager().adapterFor(typedOid);
- }
-
- final ObjectAdapter mappedTransientObject = mapping.getObject();
- if(LOG.isDebugEnabled()) {
- LOG.debug("retrieved " + mappedTransientObject.getOid() + " for " + oidStr);
- }
-
- return mappedTransientObject;
- }
-
- try {
- //LOG.debug("decoding " + oidData);
-
- //if (aggregatedId != null) {
- if(typedOid instanceof AggregatedOid) {
-
-// final RootOid parentOid = deString(objectType, oidData, State.PERSISTENT);
-// Oid aggregatedOid = new AggregatedOid(objectType, parentOid, aggregatedId);
-
- AggregatedOid aggregatedOid = (AggregatedOid) typedOid;
- final TypedOid parentOid = aggregatedOid.getParentOid();
-
- getPersistenceSession().loadObject(parentOid);
- return getAdapterManager().getAdapterFor(aggregatedOid);
- }
-
-// RootOid oid = deString(objectType, oidData, State.PERSISTENT);
-// return getPersistenceSession().loadObject(oid);
-
- return getPersistenceSession().loadObject(typedOid);
-
- } catch (final SecurityException e) {
- throw new IsisException(e);
- }
- }
-
-
- ///////////////////////////////////////////////////////
- // reloadIdentityMap (reloads the session transients)
- ///////////////////////////////////////////////////////
-
- @Override
- public void reloadIdentityMap() {
- final Iterator<TransientRootAdapterMapping> mappings = sessionTransients.values().iterator();
- while (mappings.hasNext()) {
- final TransientRootAdapterMapping mapping = mappings.next();
- mapping.reload();
- }
- }
-
-
- ////////////////////////////////////////////////////
- // unmapObject (unmaps the transients)
- ////////////////////////////////////////////////////
-
- @Override
- public void unmapObject(final ObjectAdapter object, final Scope scope) {
- sessionTransients.remove(object.getOid());
- requestTransients.remove(object.getOid());
- }
-
-
- ///////////////////////////////////////
- // helpers
- ///////////////////////////////////////
-
-// enum State { TRANSIENT, PERSISTENT }
-
-// private RootOid deString(String objectType, final String oidData, State stateHint) {
-// if(RootOid.class.isAssignableFrom(oidType)) {
-// return getOidStringifier().deString(oidData);
-// } else {
-// throw new ScimpiException("Unsupported OID type " + oidType);
-// }
-// }
-
-
-// private String enString(RootOid ows) {
-// return getOidStringifier().enString(ows);
-// }
-
-// private String enString(final Oid parentOid, final String aggregatedId) {
-// return enString(parentOid) + "@" + aggregatedId;
-// }
-
-// private String enString(final Oid oid) {
-// final String parentOidStr;
-// if(oid instanceof RootOid) {
-// RootOid ows = (RootOid) oid;
-// parentOidStr = enString(ows);
-// } else if (oid instanceof RootOidDefault) {
-// final RootOidDefault parentSerialOid = (RootOidDefault) oid;
-// parentOidStr = parentSerialOid.getIdentifier();
-// } else {
-// throw new ScimpiException("Unsupported OID type " + oid);
-// }
-// return parentOidStr;
-// }
-
-
-
- /////////////////////////////////////////////////////////////////////////
- // debugging
- /////////////////////////////////////////////////////////////////////////
-
- @Override
- public void append(final DebugBuilder debug) {
- append(debug, requestTransients, "request");
- append(debug, sessionTransients, "session");
- }
-
- private void append(final DebugBuilder debug, final Map<String, TransientRootAdapterMapping> transients, final String type) {
- final Iterator<String> ids = new HashSet<String>(transients.keySet()).iterator();
- if (ids.hasNext()) {
- debug.appendTitle("Transient objects (" + type + ")");
- while (ids.hasNext()) {
- final String key = ids.next();
- debug.appendln(key, transients.get(key).debug());
- }
- }
- }
-
- @Override
- public void appendMappings(final DebugBuilder request) {
- }
-
-
- ///////////////////////////////////////
- // from context
- ///////////////////////////////////////
-
- protected SpecificationLoaderSpi getSpecificationLoader() {
- return IsisContext.getSpecificationLoader();
- }
-
- protected PersistenceSession getPersistenceSession() {
- return IsisContext.getPersistenceSession();
- }
-
- protected AdapterManager getAdapterManager() {
- return getPersistenceSession().getAdapterManager();
- }
-
- protected OidMarshaller getOidMarshaller() {
- return IsisContext.getOidMarshaller();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultVersionMapping.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultVersionMapping.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultVersionMapping.java
deleted file mode 100644
index 2fb0006..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultVersionMapping.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.context;
-
-import org.apache.isis.core.metamodel.adapter.version.SerialNumberVersion;
-import org.apache.isis.core.metamodel.adapter.version.Version;
-
-public class DefaultVersionMapping implements VersionMapping {
-
- @Override
- public String mapVersion(final Version version) {
- // SerialNumberVersion v = (SerialNumberVersion) version;
- // return Long.toHexString(v.getSequence());
- return version.sequence();
- }
-
- @Override
- public Version getVersion(final String id) {
- final Long sequence = Long.valueOf(id, 16);
- return SerialNumberVersion.create(sequence, null, null);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/IndirectObjectMapping.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/IndirectObjectMapping.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/IndirectObjectMapping.java
deleted file mode 100644
index 2a5dfff..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/IndirectObjectMapping.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.context;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeSet;
-
-import com.google.common.collect.Maps;
-
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-
-public class IndirectObjectMapping implements ObjectMapping {
- private final Map<Scope, Map<String, Mapping>> scopedMappings = Maps.newLinkedHashMap();
- private int nextId = 0;
-
- public IndirectObjectMapping() {
- scopedMappings.put(Scope.GLOBAL, Maps.<String,Mapping>newHashMap());
- scopedMappings.put(Scope.SESSION, Maps.<String,Mapping>newHashMap());
- scopedMappings.put(Scope.INTERACTION, Maps.<String,Mapping>newHashMap());
- scopedMappings.put(Scope.REQUEST, Maps.<String,Mapping>newHashMap());
- }
-
- private String nextId() {
- nextId++;
- return String.valueOf(nextId);
- }
-
- @Override
- public void endSession() {
- scopedMappings.get(Scope.SESSION).clear();
- nextId = 0;
- }
-
- @Override
- public void reloadIdentityMap() {
- reloadIdentityMap(Scope.GLOBAL);
- reloadIdentityMap(Scope.SESSION);
- reloadIdentityMap(Scope.INTERACTION);
-
- final Map<String, Mapping> map = scopedMappings.get(Scope.INTERACTION);
- scopedMappings.put(Scope.REQUEST, map);
- scopedMappings.put(Scope.INTERACTION, new HashMap<String, Mapping>());
- }
-
- private void reloadIdentityMap(final Scope scope) {
- final Map<String, Mapping> map = scopedMappings.get(scope);
- final Iterator<String> ids = map.keySet().iterator();
- while (ids.hasNext()) {
- final String key = ids.next();
- final Mapping mapping = map.get(key);
- mapping.reload();
- }
- }
-
- @Override
- public void clear() {
- scopedMappings.get(Scope.REQUEST).clear();
- }
-
- @Override
- public void unmapObject(final ObjectAdapter object, final Scope scope) {
- final String id = mapObject(object, scope);
- scopedMappings.get(scope).remove(id);
- }
-
- @Override
- public void appendMappings(final DebugBuilder debug) {
- appendMappings(debug, scopedMappings.get(Scope.INTERACTION));
- }
-
- private void appendMappings(final DebugBuilder debug, final Map<String, Mapping> map) {
- final Iterator<String> names = map.keySet().iterator();
- while (names.hasNext()) {
- final String id = names.next();
- final ObjectAdapter object = mappedObject(id);
- debug.appendln(id, object);
- }
- }
-
- private void appendMappings(final DebugBuilder debug, final Scope scope) {
- debug.appendTitle("Objects for " + scope);
- final Map<String, Mapping> map = scopedMappings.get(scope);
- final Iterator<String> ids = new TreeSet<String>(map.keySet()).iterator();
- if (!ids.hasNext()) {
- debug.appendln("None", "");
- }
- while (ids.hasNext()) {
- final String key = ids.next();
- debug.appendln(key, map.get(key).debug());
- }
- }
-
- private Mapping createMapping(final ObjectAdapter adapter) {
- if (adapter.isTransient()) {
- return new TransientRootAdapterMapping(adapter);
- } else {
- return new PersistentRootAdapterMapping(adapter);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.apache.isis.webapp.context.ObjectMapping#mappedObject(java.lang.String
- * )
- */
- @Override
- public ObjectAdapter mappedObject(final String id) {
- final Iterator<Map<String, Mapping>> iterator = scopedMappings.values().iterator();
- while (iterator.hasNext()) {
- final Map<String, Mapping> map = iterator.next();
- final Mapping mapping = map.get(id);
- if (mapping != null) {
- return mapping.getObject();
- }
- }
- return null;
- }
-
- @Override
- public String mapObject(final ObjectAdapter obj, final Scope scope) {
- ObjectAdapter object;
- object = obj;
- final Mapping mapping = createMapping(object);
-
- boolean changeScope = false;
- for (final Scope s : scopedMappings.keySet()) {
- final Map<String, Mapping> map = scopedMappings.get(s);
- if (map.containsValue(mapping)) {
- final String id = findMapping(map, mapping);
- if (changeScope) {
- map.remove(id);
- scopedMappings.get(scope).put(id, mapping);
- }
- return id;
- }
-
- if (s == scope) {
- changeScope = true;
- }
- }
-
- final Map<String, Mapping> map = scopedMappings.get(scope);
- final String id = obj.getSpecification().getShortIdentifier() + "@" + nextId();
- map.put(id, mapping);
- return id;
- }
-
- private String findMapping(final Map<String, Mapping> map, final Mapping mapping) {
- final Iterator<String> ids = map.keySet().iterator();
- while (ids.hasNext()) {
- final String key = ids.next();
- if (map.get(key).equals(mapping)) {
- return key;
- }
- }
-
- return null;
- }
-
- @Override
- public void append(final DebugBuilder debug) {
- debug.appendln("Next ID", nextId);
-
- appendMappings(debug, Scope.GLOBAL);
- appendMappings(debug, Scope.SESSION);
- appendMappings(debug, Scope.INTERACTION);
- appendMappings(debug, Scope.REQUEST);
- }
-
- @Override
- public ObjectAdapter mappedTransientObject(final String substring) {
- throw new NotYetImplementedException();
- }
-
- @Override
- public String mapTransientObject(final ObjectAdapter object) {
- throw new NotYetImplementedException();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java
deleted file mode 100644
index a41481b..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.context;
-
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.runtime.memento.Memento;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-
-interface Mapping {
- ObjectAdapter getObject();
-
- Oid getOid();
-
- String debug();
-
- void reload();
-
- void update();
-}
-
-class TransientRootAdapterMapping implements Mapping {
- private final RootOid oid;
- private Memento memento;
-
- public TransientRootAdapterMapping(final ObjectAdapter adapter) {
- oid = (RootOid) adapter.getOid();
- Assert.assertTrue("OID is for persistent", oid.isTransient());
- Assert.assertTrue("adapter is for persistent", adapter.isTransient());
- memento = new Memento(adapter);
- }
-
- @Override
- public ObjectAdapter getObject() {
- return getAdapterManager().getAdapterFor(oid);
- }
-
- @Override
- public Oid getOid() {
- return oid;
- }
-
- @Override
- public void reload() {
- memento.recreateObject();
- }
-
- @Override
- public void update() {
- memento = new Memento(getObject());
- }
-
-
- ////////////////////////////////////
- // debug
- ////////////////////////////////////
-
- @Override
- public String debug() {
- final DebugString debug = new DebugString();
- memento.debug(debug);
- return debug.toString();
- }
-
- ////////////////////////////////////
- // equals, hashCode
- ////////////////////////////////////
-
- @Override
- public boolean equals(final Object obj) {
- if (obj == this) {
- return true;
- }
-
- if (obj instanceof TransientRootAdapterMapping) {
- return ((TransientRootAdapterMapping) obj).oid.equals(oid);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return oid.hashCode();
- }
-
-
- ////////////////////////////////////
- // from context
- ////////////////////////////////////
-
- private AdapterManager getAdapterManager() {
- return getPersistenceSession().getAdapterManager();
- }
-
- private PersistenceSession getPersistenceSession() {
- return IsisContext.getPersistenceSession();
- }
-}
-
-class PersistentRootAdapterMapping implements Mapping {
- private final RootOid oid;
- private final ObjectSpecification spec;
-
- public PersistentRootAdapterMapping(final ObjectAdapter object) {
- this.oid = (RootOid) object.getOid();
- this.spec = object.getSpecification();
- }
-
- @Override
- public Oid getOid() {
- return oid;
- }
-
- @Override
- public ObjectAdapter getObject() {
- if (!IsisContext.inTransaction()) {
- throw new IllegalStateException(getClass().getSimpleName() + " requires transaction in order to load");
- }
- return getPersistenceSession().loadObject(oid);
- }
-
- @Override
- public void reload() {
- // will only recreate if not already in the adapter mgr maps.
- getAdapterManager().adapterFor(oid);
- }
-
-
- @Override
- public void update() {
- }
-
- ////////////////////////////////////
- // debug
- ////////////////////////////////////
-
- @Override
- public String debug() {
- return oid + " " + spec.getShortIdentifier() + " " + getAdapterManager().getAdapterFor(oid);
- }
-
- ////////////////////////////////////
- // equals, hashCode
- ////////////////////////////////////
-
- @Override
- public boolean equals(final Object obj) {
- if (obj == this) {
- return true;
- }
-
- if (obj instanceof PersistentRootAdapterMapping) {
- final PersistentRootAdapterMapping other = (PersistentRootAdapterMapping) obj;
- return oid.equals(other.oid) && spec == other.spec;
- }
-
- return false;
- }
-
-
- @Override
- public int hashCode() {
- int hash = 37;
- hash = hash * 17 + oid.hashCode();
- hash = hash * 17 + spec.hashCode();
- return hash;
- }
-
-
- ////////////////////////////////////
- // from context
- ////////////////////////////////////
-
- protected PersistenceSession getPersistenceSession() {
- return IsisContext.getPersistenceSession();
- }
-
- protected AdapterManager getAdapterManager() {
- return getPersistenceSession().getAdapterManager();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/ObjectMapping.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/ObjectMapping.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/ObjectMapping.java
deleted file mode 100644
index 9fe4013..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/ObjectMapping.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.context;
-
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-
-public interface ObjectMapping {
-
- void reloadIdentityMap();
- void endSession();
-
- void clear();
-
- String mapObject(ObjectAdapter obj, Scope scope);
- String mapTransientObject(ObjectAdapter object);
- void unmapObject(ObjectAdapter object, Scope scope);
-
- ObjectAdapter mappedObject(String oidStr);
- ObjectAdapter mappedTransientObject(String jsonData);
-
- void append(DebugBuilder debug);
- void appendMappings(DebugBuilder debug);
-}
[40/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
new file mode 100644
index 0000000..13e24f9
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package integration.tests.smoke;
+
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+import fixture.simple.scenario.SimpleObjectsFixture;
+import fixture.simple.SimpleObjectsTearDownFixture;
+import integration.tests.SimpleAppIntegTest;
+
+import javax.inject.Inject;
+import org.junit.Test;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectTest extends SimpleAppIntegTest {
+
+ @Inject
+ FixtureScripts fixtureScripts;
+ @Inject
+ SimpleObjects simpleObjects;
+
+ FixtureScript fixtureScript;
+
+ public static class Name extends SimpleObjectTest {
+
+ @Test
+ public void exists() throws Exception {
+
+ // given
+ fixtureScript = new SimpleObjectsFixture();
+ fixtureScripts.runFixtureScript(fixtureScript, null);
+
+ final SimpleObject simpleObjectPojo =
+ fixtureScript.lookup("simple-objects-fixture/simple-object-for-foo/item-1", SimpleObject.class);
+
+ // when
+ assertThat(simpleObjectPojo, is(not(nullValue())));
+ final SimpleObject simpleObjectWrapped = wrap(simpleObjectPojo);
+
+ // then
+ assertThat(simpleObjectWrapped.getName(), is("Foo"));
+ }
+
+ @Test
+ public void doesNotExist() throws Exception {
+
+ // given
+ fixtureScript = new SimpleObjectsTearDownFixture();
+ fixtureScripts.runFixtureScript(fixtureScript, null);
+
+ // when
+ SimpleObject simpleObjectPojo = fixtureScript.lookup("non-existent", SimpleObject.class);
+
+ // then
+ assertThat(simpleObjectPojo, is(nullValue()));
+
+ }
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
new file mode 100644
index 0000000..3963c8c
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package integration.tests.smoke;
+
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+import fixture.simple.scenario.SimpleObjectsFixture;
+import fixture.simple.SimpleObjectsTearDownFixture;
+import integration.tests.SimpleAppIntegTest;
+
+import java.sql.SQLIntegrityConstraintViolationException;
+import java.util.List;
+import javax.inject.Inject;
+import com.google.common.base.Throwables;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectsTest extends SimpleAppIntegTest {
+
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
+ @Inject
+ FixtureScripts fixtureScripts;
+ @Inject
+ SimpleObjects simpleObjects;
+
+ FixtureScript fixtureScript;
+
+ public static class ListAll extends SimpleObjectsTest {
+
+ @Test
+ public void happyCase() throws Exception {
+
+ // given
+ fixtureScript = new SimpleObjectsFixture();
+ fixtureScripts.runFixtureScript(fixtureScript, null);
+ nextTransaction();
+
+ // when
+ final List<SimpleObject> all = wrap(simpleObjects).listAll();
+
+ // then
+ assertThat(all.size(), is(3));
+
+ SimpleObject simpleObject = wrap(all.get(0));
+ assertThat(simpleObject.getName(), is("Foo"));
+ }
+
+ @Test
+ public void whenNone() throws Exception {
+
+ // given
+ fixtureScript = new SimpleObjectsTearDownFixture();
+ fixtureScripts.runFixtureScript(fixtureScript, null);
+ nextTransaction();
+
+ // when
+ final List<SimpleObject> all = wrap(simpleObjects).listAll();
+
+ // then
+ assertThat(all.size(), is(0));
+ }
+ }
+
+ public static class Create extends SimpleObjectsTest {
+
+ @Test
+ public void happyCase() throws Exception {
+
+ // given
+ fixtureScript = new SimpleObjectsTearDownFixture();
+ fixtureScripts.runFixtureScript(fixtureScript, null);
+ nextTransaction();
+
+ // when
+ wrap(simpleObjects).create("Faz");
+
+ // then
+ final List<SimpleObject> all = wrap(simpleObjects).listAll();
+ assertThat(all.size(), is(1));
+ }
+
+ @Test
+ public void whenAlreadyExists() throws Exception {
+
+ // given
+ fixtureScript = new SimpleObjectsTearDownFixture();
+ fixtureScripts.runFixtureScript(fixtureScript, null);
+ nextTransaction();
+ wrap(simpleObjects).create("Faz");
+ nextTransaction();
+
+ // then
+ expectedException.expectCause(causalChainContains(SQLIntegrityConstraintViolationException.class));
+
+ // when
+ wrap(simpleObjects).create("Faz");
+ nextTransaction();
+ }
+
+ private static Matcher<? extends Throwable> causalChainContains(final Class<?> cls) {
+ return new TypeSafeMatcher<Throwable>() {
+ @Override
+ protected boolean matchesSafely(Throwable item) {
+ final List<Throwable> causalChain = Throwables.getCausalChain(item);
+ for (Throwable throwable : causalChain) {
+ if(cls.isAssignableFrom(throwable.getClass())){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("exception with causal chain containing " + cls.getSimpleName());
+ }
+ };
+ }
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/pom.xml b/example/application/neoapp/pom.xml
new file mode 100644
index 0000000..8d9d86c
--- /dev/null
+++ b/example/application/neoapp/pom.xml
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+--><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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.apache.isis.example.application</groupId>
+ <artifactId>neoapp</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+
+ <name>Neo App</name>
+
+ <packaging>pom</packaging>
+
+ <prerequisites>
+ <maven>3.0.4</maven>
+ </prerequisites>
+
+ <properties>
+ <isis.version>1.8.0-SNAPSHOT</isis.version>
+ <isis-viewer-wicket.version>1.8.0-SNAPSHOT</isis-viewer-wicket.version>
+
+ <!-- must be consistent with the versions defined by the JDO Objectstore -->
+ <datanucleus-accessplatform-jdo-rdbms.version>4.0.4</datanucleus-accessplatform-jdo-rdbms.version>
+ <datanucleus-jodatime.version>4.0.4</datanucleus-jodatime.version>
+ <datanucleus-maven-plugin.version>4.0.0-release</datanucleus-maven-plugin.version>
+
+
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ </properties>
+
+ <repositories>
+ <repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshots</name>
+ <url>https://repository.apache.org/content/repositories/snapshots/</url>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ <snapshots>
+ </snapshots>
+ </repository>
+ <repository>
+ <id>Cloudbees snapshots</id>
+ <url>http://repository-estatio.forge.cloudbees.com/snapshot/</url>
+ <snapshots>
+ </snapshots>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ </repository>
+ </repositories>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.1</version>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ <executions>
+ <execution>
+ <id>source</id>
+ <phase>compile</phase>
+ </execution>
+ <execution>
+ <id>test</id>
+ <phase>test-compile</phase>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.16</version>
+ <configuration>
+ <includes>
+ <include>**/*Test.java</include>
+ <include>**/*Test$*.java</include>
+ <include>**/*Test_*.java</include>
+ <include>**/*Spec*.java</include>
+ </includes>
+ <excludes>
+ <exclude>**/Test*.java</exclude>
+ <exclude>**/*ForTesting.java</exclude>
+ <exclude>**/*Abstract*.java</exclude>
+ </excludes>
+ <useFile>true</useFile>
+ <printSummary>true</printSummary>
+ <outputDirectory>${project.build.directory}/surefire-reports</outputDirectory>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-report-plugin</artifactId>
+ <version>2.16</version>
+ <configuration>
+ <includes>
+ <include>**/*Test.java</include>
+ <include>**/*Test$*.java</include>
+ <include>**/*Test_*.java</include>
+ <include>**/*Spec*.java</include>
+ </includes>
+ <excludes>
+ <exclude>**/Test*.java</exclude>
+ <exclude>**/*ForTesting.java</exclude>
+ <exclude>**/*Abstract*.java</exclude>
+ </excludes>
+ <showSuccess>false</showSuccess>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>test</phase>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-clean-plugin</artifactId>
+ <version>2.5</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.6</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.4</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-install-plugin</artifactId>
+ <version>2.5.1</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.8.1</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-site-plugin</artifactId>
+ <version>3.3</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-war-plugin</artifactId>
+ <version>2.4</version>
+ </plugin>
+
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <version>2.2</version>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.7</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <!-- http://simplericity.com/2009/11/10/1257880778509.html -->
+ <plugin>
+ <groupId>org.simplericity.jettyconsole</groupId>
+ <artifactId>jetty-console-maven-plugin</artifactId>
+ <!-- update to 1.54 reversed,since seems compiled against 1.7 (major.minor version 51.0) -->
+ <version>1.43</version>
+ </plugin>
+
+ <!-- Apache Release Audit Tool -->
+ <plugin>
+ <groupId>org.apache.rat</groupId>
+ <artifactId>apache-rat-plugin</artifactId>
+ <version>0.10</version>
+ <configuration>
+ <addDefaultLicenseMatchers>true</addDefaultLicenseMatchers>
+ <excludeSubProjects>true</excludeSubProjects>
+ <excludes>
+ <exclude>**/target/**</exclude>
+ <exclude>**/target-ide/**</exclude>
+
+ <exclude>**/*.project</exclude>
+ <exclude>**/.classpath</exclude>
+ <exclude>**/.settings/**</exclude>
+ <exclude>**/*.launch</exclude>
+ <exclude>**/ide/eclipse/launch/**</exclude>
+ <exclude>**/ide/intellij/launch/**</exclude>
+ <exclude>src/site/resources/ide/eclipse/**</exclude>
+
+ <exclude>**/rebel.xml</exclude>
+ <exclude>**/*.gitignore</exclude>
+ <exclude>**/*.log</exclude>
+ <exclude>**/*.pdn</exclude>
+ <exclude>**/*.svg</exclude>
+ <exclude>**/*.json</exclude>
+ <exclude>**/*.min.js</exclude>
+ <exclude>**/*.js</exclude>
+ </excludes>
+ <licenses>
+ <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+ <licenseFamilyCategory>AL2</licenseFamilyCategory>
+ <licenseFamilyName>Apache License 2.0</licenseFamilyName>
+ <notes/>
+ <patterns>
+ <pattern>Licensed to the Apache Software Foundation (ASF) under one</pattern>
+ </patterns>
+ </license>
+ <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+ <licenseFamilyCategory>JQRY</licenseFamilyCategory>
+ <licenseFamilyName>MIT</licenseFamilyName>
+ <notes/>
+ <patterns>
+ <pattern>Dual licensed under the MIT or GPL Version 2 licenses.</pattern>
+ </patterns>
+ </license>
+ <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+ <licenseFamilyCategory>JMOCK</licenseFamilyCategory>
+ <licenseFamilyName>JMock</licenseFamilyName>
+ <notes/>
+ <patterns>
+ <pattern>Copyright (c) 2000-2007, jMock.org</pattern>
+ </patterns>
+ </license>
+ <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+ <licenseFamilyCategory>DOCBK</licenseFamilyCategory>
+ <licenseFamilyName>DocBook 4.5</licenseFamilyName>
+ <notes/>
+ <patterns>
+ <pattern>Permission to copy in any form is granted for use</pattern>
+ <pattern>Permission to use, copy, modify and distribute the DocBook DTD</pattern>
+ <pattern>is hereby granted in perpetuity, provided that the above copyright</pattern>
+ <pattern>This is the catalog data file for DocBook XML V4.5. It is provided as</pattern>
+ <pattern>XML Catalog data for DocBook XML V4.5</pattern>
+ <pattern>DocBook additional general entities V4.5</pattern>
+ <pattern>XML EXCHANGE TABLE MODEL DECLARATION MODULE</pattern>
+ </patterns>
+ </license>
+ <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+ <licenseFamilyCategory>W3C</licenseFamilyCategory>
+ <licenseFamilyName>XHTML</licenseFamilyName>
+ <notes/>
+ <patterns>
+ <pattern>Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),</pattern>
+ </patterns>
+ </license>
+ </licenses>
+ <licenseFamilies>
+ <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+ <familyName>Apache License 2.0</familyName>
+ </licenseFamily>
+ <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+ <familyName>MIT</familyName>
+ </licenseFamily>
+ <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+ <familyName>JMock</familyName>
+ </licenseFamily>
+ <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+ <familyName>DocBook 4.5</familyName>
+ </licenseFamily>
+ <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+ <familyName>XHTML</familyName>
+ </licenseFamily>
+ </licenseFamilies>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-report-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencyManagement>
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis</artifactId>
+ <version>${isis.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-wicket</artifactId>
+ <version>${isis-viewer-wicket.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+
+
+ <!-- this project's own modules -->
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>neoapp-dom</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>neoapp-fixture</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>neoapp-webapp</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </dependency>
+
+
+ </dependencies>
+ </dependencyManagement>
+
+
+ <profiles>
+ <profile>
+ <id>m2e</id>
+ <activation>
+ <property>
+ <name>m2e.version</name>
+ </property>
+ </activation>
+ <build>
+ <directory>target-ide</directory>
+ </build>
+ </profile>
+ </profiles>
+
+ <modules>
+ <module>dom</module>
+ <module>fixture</module>
+ <module>integtests</module>
+ <module>webapp</module>
+ </modules>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/.gitignore b/example/application/neoapp/webapp/.gitignore
new file mode 100644
index 0000000..0b7106e
--- /dev/null
+++ b/example/application/neoapp/webapp/.gitignore
@@ -0,0 +1,4 @@
+/testDB/
+/.shell_history
+/messages.log
+/neo4j_DB/
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
new file mode 100644
index 0000000..c7829fc
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?><launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+ <listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+ </listAttribute>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+ <listEntry value="1"/>
+ </listAttribute>
+ <mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+ <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[debug]"/>
+ <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[run]"/>
+ </mapAttribute>
+ <stringAttribute value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector" key="org.eclipse.debug.core.source_locator_id"/>
+ <stringAttribute value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <sourceLookupDirector> <sourceContainers duplicates="false"> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;javaProject name=&quot;isis-jrebel-plugin&quot;/&gt;&#13;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;default/&gt;&#13;&#10;" typeId="org.eclipse.debug.core.containerType.default"/> </sourceContainers> </sourceLookupDirector> " key="org.eclipse.debug.core.source_locator_meme
nto"/>
+ <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+ <listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+ </listAttribute>
+ <booleanAttribute value="true" key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS"/>
+ <listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+ <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" path="1" type="4"/> "/>
+ <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="simple_wicket_restful_jdo-webapp" type="1"/> "/>
+ <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER" path="3" type="4"/> "/>
+ </listAttribute>
+ <stringAttribute value="org.eclipse.m2e.launchconfig.classpathProvider" key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER"/>
+ <booleanAttribute value="true" key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH"/>
+ <stringAttribute value="org.apache.isis.WebServer" key="org.eclipse.jdt.launching.MAIN_TYPE"/>
+ <stringAttribute value="--port 8080 --type PROTOTYPE" key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS"/>
+ <stringAttribute value="neoapp-webapp" key="org.eclipse.jdt.launching.PROJECT_ATTR"/>
+ <stringAttribute value="org.eclipse.m2e.launchconfig.sourcepathProvider" key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER"/>
+ <stringAttribute value="${jrebel_args} -Drebel.log=false -Drebel.check_class_hash=true -Drebel.packages_exclude=org.apache.isis -Dproject.root=${project_loc}/.. -Dtarget.dir=target-ide -Drebel.plugins=C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar -Disis-jrebel-plugin.packagePrefix=dom.simple,org.apache.isis.objectstore.jdo.applib -Disis-jrebel-plugin.loggingLevel=warn -XX:MaxPermSize=128m" key="org.eclipse.jdt.launching.VM_ARGUMENTS"/>
+</launchConfiguration>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch
new file mode 100644
index 0000000..7b321c1
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?><launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+ <listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+ </listAttribute>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+ <listEntry value="1"/>
+ </listAttribute>
+ <mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+ <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[debug]"/>
+ <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[run]"/>
+ </mapAttribute>
+ <stringAttribute value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector" key="org.eclipse.debug.core.source_locator_id"/>
+ <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+ <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+ </listAttribute>
+ <booleanAttribute value="true" key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS"/>
+ <stringAttribute value="org.eclipse.m2e.launchconfig.classpathProvider" key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER"/>
+ <stringAttribute value="org.apache.isis.WebServer" key="org.eclipse.jdt.launching.MAIN_TYPE"/>
+ <stringAttribute value="--port 8080 --type SERVER_PROTOTYPE" key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS"/>
+ <stringAttribute value="neoapp-webapp" key="org.eclipse.jdt.launching.PROJECT_ATTR"/>
+ <stringAttribute value="org.eclipse.m2e.launchconfig.sourcepathProvider" key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER"/>
+</launchConfiguration>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch
new file mode 100644
index 0000000..c778a57
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?><launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+ <listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+ </listAttribute>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+ <listEntry value="1"/>
+ </listAttribute>
+ <mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+ <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[debug]"/>
+ <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[run]"/>
+ </mapAttribute>
+ <stringAttribute value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector" key="org.eclipse.debug.core.source_locator_id"/>
+ <booleanAttribute value="true" key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS"/>
+ <stringAttribute value="org.eclipse.m2e.launchconfig.classpathProvider" key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER"/>
+ <stringAttribute value="org.apache.isis.WebServer" key="org.eclipse.jdt.launching.MAIN_TYPE"/>
+ <stringAttribute value="--port 8080 -D isis.persistor.datanucleus.install-fixtures=true --type SERVER_PROTOTYPE" key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS"/>
+ <stringAttribute value="neoapp-webapp" key="org.eclipse.jdt.launching.PROJECT_ATTR"/>
+ <stringAttribute value="org.eclipse.m2e.launchconfig.sourcepathProvider" key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER"/>
+</launchConfiguration>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch
new file mode 100644
index 0000000..422a178
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch
@@ -0,0 +1,47 @@
+<<<<<<< HEAD
+<?xml version="1.0" encoding="UTF-8"?><launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+ <listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+ </listAttribute>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+ <listEntry value="1"/>
+ </listAttribute>
+ <mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+ <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[debug]"/>
+ <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[run]"/>
+ </mapAttribute>
+ <stringAttribute value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector" key="org.eclipse.debug.core.source_locator_id"/>
+ <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+ <listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+ </listAttribute>
+ <booleanAttribute value="true" key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS"/>
+ <stringAttribute value="org.eclipse.m2e.launchconfig.classpathProvider" key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER"/>
+ <stringAttribute value="org.apache.isis.WebServer" key="org.eclipse.jdt.launching.MAIN_TYPE"/>
+ <stringAttribute value="--port 8080 --type SERVER" key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS"/>
+ <stringAttribute value="neoapp-webapp" key="org.eclipse.jdt.launching.PROJECT_ATTR"/>
+ <stringAttribute value="org.eclipse.m2e.launchconfig.sourcepathProvider" key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER"/>
+=======
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+<mapEntry key="[debug]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+<mapEntry key="[run]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.apache.isis.WebServer"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--port 8080 --type SERVER"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="simpleapp-webapp"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+>>>>>>> refs/heads/DN_404
+</launchConfiguration>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/ide/intellij/launch/README.txt
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/intellij/launch/README.txt b/example/application/neoapp/webapp/ide/intellij/launch/README.txt
new file mode 100644
index 0000000..5f8e5ab
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/intellij/launch/README.txt
@@ -0,0 +1,2 @@
+Copy into workspace\.idea\runConfigurations directory, and adjust file paths for Maven tasks.
+
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml
new file mode 100644
index 0000000..9833a2d
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml
@@ -0,0 +1,28 @@
+<component name="ProjectRunConfigurationManager">
+ <configuration default="false" name="SimpleApp-PROTOTYPE" type="Application" factoryName="Application" singleton="true">
+ <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+ <option name="MAIN_CLASS_NAME" value="org.apache.isis.WebServer" />
+ <option name="VM_PARAMETERS" value="" />
+ <option name="PROGRAM_PARAMETERS" value="--type SERVER_PROTOTYPE --port 8080" />
+ <option name="WORKING_DIRECTORY" value="file://$MODULE_DIR$" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" value="" />
+ <option name="ENABLE_SWING_INSPECTOR" value="false" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <module name="neoapp-webapp" />
+ <envs />
+ <RunnerSettings RunnerId="Debug">
+ <option name="DEBUG_PORT" value="" />
+ <option name="TRANSPORT" value="0" />
+ <option name="LOCAL" value="true" />
+ </RunnerSettings>
+ <RunnerSettings RunnerId="Run" />
+ <ConfigurationWrapper RunnerId="Debug" />
+ <ConfigurationWrapper RunnerId="Run" />
+ <method>
+ <option name="Make" enabled="false" />
+ <option name="Maven.BeforeRunTask" enabled="true" file="C:/Apache/Isis/example/application/neoapp/dom/pom.xml" goal="datanucleus:enhance -o" />
+ </method>
+ </configuration>
+</component>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml
new file mode 100644
index 0000000..a593956
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml
@@ -0,0 +1,22 @@
+<component name="ProjectRunConfigurationManager">
+s <configuration default="false" name="SimpleApp (enhance only)" type="Application" factoryName="Application">
+ <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+ <option name="MAIN_CLASS_NAME" value="org.apache.isis.Dummy" />
+ <option name="VM_PARAMETERS" value="" />
+ <option name="PROGRAM_PARAMETERS" value="" />
+ <option name="WORKING_DIRECTORY" value="file://$MODULE_DIR$" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" value="" />
+ <option name="ENABLE_SWING_INSPECTOR" value="false" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <module name="neoapp-webapp" />
+ <envs />
+ <RunnerSettings RunnerId="Run" />
+ <ConfigurationWrapper RunnerId="Run" />
+ <method>
+ <option name="Make" enabled="false" />
+ <option name="Maven.BeforeRunTask" enabled="true" file="C:/Apache/Isis/example/application/neoapp/dom/pom.xml" goal="datanucleus:enhance -o" />
+ </method>
+ </configuration>
+</component>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/lib/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/lib/.gitignore b/example/application/neoapp/webapp/lib/.gitignore
new file mode 100644
index 0000000..70eee7e
--- /dev/null
+++ b/example/application/neoapp/webapp/lib/.gitignore
@@ -0,0 +1,5 @@
+#
+# explicitly ignoring Microsoft JDBC4 jar
+# (cannot redistribute, licensing)
+#
+sqljdbc4.jar
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/pom.xml b/example/application/neoapp/webapp/pom.xml
new file mode 100644
index 0000000..1dd01ee
--- /dev/null
+++ b/example/application/neoapp/webapp/pom.xml
@@ -0,0 +1,350 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+--><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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.isis.example.application</groupId>
+ <artifactId>neoapp</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>neoapp-webapp</artifactId>
+ <name>Neo App Webapp</name>
+
+ <description>This module runs both the Wicket viewer and the Restfulobjects viewer in a single webapp configured to run using the datanucleus object store.</description>
+
+ <packaging>war</packaging>
+
+ <properties>
+ <siteBaseDir>..</siteBaseDir>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ </plugin>
+
+ <!-- mvn package -->
+ <plugin>
+ <groupId>org.simplericity.jettyconsole</groupId>
+ <artifactId>jetty-console-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>createconsole</goal>
+ </goals>
+ <configuration>
+ <backgroundImage>${basedir}/src/main/jettyconsole/isis-banner.png</backgroundImage>
+ <destinationFile>${project.build.directory}/${project.build.finalName}-jetty-console.jar</destinationFile>
+ </configuration>
+ <phase>package</phase>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>1.8</version>
+ <executions>
+ <execution>
+ <phase>validate</phase>
+ <goals>
+ <goal>maven-version</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-war-plugin</artifactId>
+ <configuration>
+ <warName>simpleapp</warName>
+ <archive>
+ <manifest>
+ <addClasspath>false</addClasspath>
+ </manifest>
+ <manifestEntries>
+ <Build-Time>${maven.build.timestamp}</Build-Time>
+ <Build-Host>${agent.name}</Build-Host>
+ <Build-User>${user.name}</Build-User>
+ <Build-Maven>Maven ${maven.version}</Build-Maven>
+ <Build-Java>${java.version}</Build-Java>
+ <Build-OS>${os.name}</Build-OS>
+ <Build-Label>${project.version}</Build-Label>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+
+ </plugins>
+ <pluginManagement>
+ <plugins>
+ <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+ <plugin>
+ <groupId>org.eclipse.m2e</groupId>
+ <artifactId>lifecycle-mapping</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <lifecycleMappingMetadata>
+ <pluginExecutions>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <versionRange>[1.5,)</versionRange>
+ <goals>
+ <goal>maven-version</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ </pluginExecutions>
+ </lifecycleMappingMetadata>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <dependencies>
+
+ <!-- other modules in this project -->
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>neoapp-dom</artifactId>
+ <exclusions>
+ <exclusion>
+ <!-- so don't pick up transitive dependency to asm 4.0.0 -->
+ <groupId>org.datanucleus</groupId>
+ <artifactId>datanucleus-enhancer</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>neoapp-fixture</artifactId>
+ <exclusions>
+ <exclusion>
+ <!-- so don't pick up transitive dependency to asm 4.0.0 -->
+ <groupId>org.datanucleus</groupId>
+ <artifactId>datanucleus-enhancer</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <!-- other isis components -->
+ <dependency>
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-wicket-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-viewer-restfulobjects-server</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-security-shiro</artifactId>
+ </dependency>
+
+
+ <!-- isis core -->
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-runtime</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-wrapper</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-security</artifactId>
+ </dependency>
+
+
+ <!-- to run using WebServer (optional) -->
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-webserver</artifactId>
+ <scope>runtime</scope>
+ <optional>true</optional>
+ </dependency>
+
+
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-servlet_2.5_spec</artifactId>
+ <!--
+ removed so can run o.a.i.WebServer from within IntelliJ;
+ can rely on servlet container to ignore this in war file
+ <scope>provided</scope>
+ -->
+ </dependency>
+
+ <!--
+ JDBC drivers
+ (for jdo objectstore)
+ -->
+ <dependency>
+ <groupId>org.datanucleus</groupId>
+ <artifactId>datanucleus-neo4j</artifactId>
+ <version>3.2.3</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hsqldb</groupId>
+ <artifactId>hsqldb</artifactId>
+ </dependency>
+
+ <!--
+ <dependency>
+ <groupId>postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <version>9.1-901.jdbc4</version>
+ </dependency>
+ -->
+
+ <!--
+ mvn install:install-file -Dfile=sqljdbc4.jar \
+ -DgroupId=com.microsoft.sqlserver \
+ -DartifactId=jdbc \
+ -Dversion=4.0 \
+ -Dpackaging=jar
+ -->
+ <!--
+ <dependency>
+ <groupId>com.microsoft.sqlserver</groupId>
+ <artifactId>sqljdbc4</artifactId>
+ <version>4.0</version>
+ </dependency>
+ -->
+
+ <dependency>
+ <groupId>org.lazyluke</groupId>
+ <artifactId>log4jdbc-remix</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+
+ <!-- https://github.com/Sprint/isis-neo4j -->
+ <dependency>
+ <groupId>com.sprint</groupId>
+ <artifactId>isis-neo4j</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </dependency>
+
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <id>self-host</id>
+ <build>
+ <plugins>
+ <!--
+ mvn -P self-host antrun:run
+ -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <configuration>
+ <tasks>
+ <exec executable="java" failonerror="true">
+ <arg value="-jar" />
+ <arg value="${project.build.directory}/${project.build.finalName}-jetty-console.jar" />
+ </exec>
+ </tasks>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+
+ <profile>
+ <id>jrebel</id>
+ <properties>
+ <!-- as used in the rebel.xml in the dom project -->
+ <target.dir>target</target.dir>
+ <isis-jrebel-plugin.packagePrefix>dom.simple,org.apache.isis.objectstore.jdo.applib</isis-jrebel-plugin.packagePrefix>
+ <isis-jrebel-plugin.loggingLevel>warn</isis-jrebel-plugin.loggingLevel>
+ </properties>
+ <build>
+ <plugins>
+ <!--
+ mvn -P jrebel antrun:run \
+ -Djrebel.jar="C:/Users/Dan/.IdeaIC13/config/plugins/jr-ide-idea/lib/jrebel/jrebel.jar" \
+ -Disis_jrebel_plugin.jar="C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar"
+ -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <configuration>
+ <target>
+ <property name="compile_classpath" refid="maven.compile.classpath" />
+ <property name="runtime_classpath" refid="maven.runtime.classpath" />
+ <property name="test_classpath" refid="maven.test.classpath" />
+ <property name="plugin_classpath" refid="maven.plugin.classpath" />
+
+ <echo message="" />
+ <echo message="" />
+ <echo message="jrebel.jar = ${jrebel.jar}" />
+ <echo message="isis_jrebel_plugin.jar = ${isis_jrebel_plugin.jar}" />
+ <echo message="target.dir = ${target.dir}" />
+ <echo message="" />
+ <echo message="" />
+
+ <exec executable="java" failonerror="true">
+ <arg value="-javaagent:${jrebel.jar}" />
+ <arg value="-Drebel.log=false" />
+ <arg value="-Drebel.check_class_hash=true" />
+ <arg value="-Drebel.packages_exclude=org.apache.isis" />
+
+ <!-- as used in the rebel.xml in the dom project -->
+ <arg value="-Dproject.root=${project.basedir}/.." />
+ <arg value="-Dtarget.dir=${target.dir}" />
+
+ <arg value="-Drebel.plugins=${isis_jrebel_plugin.jar}" />
+ <arg value="-Disis-jrebel-plugin.packagePrefix=${isis-jrebel-plugin.packagePrefix}" />
+ <arg value="-Disis-jrebel-plugin.loggingLevel=${isis-jrebel-plugin.loggingLevel}" />
+ <arg value="-XX:MaxPermSize=128m" />
+ <arg value="-classpath" />
+ <arg value="${runtime_classpath}" />
+ <arg value="org.apache.isis.WebServer" />
+ </exec>
+ </target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+
+
+</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java b/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java
new file mode 100644
index 0000000..439806a
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package webapp;
+
+import de.agilecoders.wicket.core.Bootstrap;
+import de.agilecoders.wicket.core.settings.IBootstrapSettings;
+import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchTheme;
+import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchThemeProvider;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import com.google.common.base.Joiner;
+import com.google.common.io.Resources;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.name.Names;
+import com.google.inject.util.Modules;
+import com.google.inject.util.Providers;
+import org.apache.wicket.Session;
+import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.request.http.WebRequest;
+import org.apache.isis.viewer.wicket.viewer.IsisWicketApplication;
+import org.apache.isis.viewer.wicket.viewer.integration.wicket.AuthenticatedWebSessionForIsis;
+
+
+/**
+ * As specified in <tt>web.xml</tt>.
+ *
+ * <p>
+ * See:
+ * <pre>
+ * <filter>
+ * <filter-name>wicket</filter-name>
+ * <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
+ * <init-param>
+ * <param-name>applicationClassName</param-name>
+ * <param-value>webapp.SimpleApplication</param-value>
+ * </init-param>
+ * </filter>
+ * </pre>
+ *
+ */
+public class SimpleApplication extends IsisWicketApplication {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * uncomment for a (slightly hacky) way of allowing logins using query args, eg:
+ *
+ * <tt>?user=sven&pass=pass</tt>
+ *
+ * <p>
+ * for demos only, obvious.
+ */
+ private final static boolean DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS = false;
+
+
+ @Override
+ protected void init() {
+ super.init();
+
+ IBootstrapSettings settings = Bootstrap.getSettings();
+ settings.setThemeProvider(new BootswatchThemeProvider(BootswatchTheme.Flatly));
+ }
+
+ @Override
+ public Session newSession(final Request request, final Response response) {
+ if(!DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS) {
+ return super.newSession(request, response);
+ }
+
+ // else demo mode
+ final AuthenticatedWebSessionForIsis s = (AuthenticatedWebSessionForIsis) super.newSession(request, response);
+ IRequestParameters requestParameters = request.getRequestParameters();
+ final org.apache.wicket.util.string.StringValue user = requestParameters.getParameterValue("user");
+ final org.apache.wicket.util.string.StringValue password = requestParameters.getParameterValue("pass");
+ s.signIn(user.toString(), password.toString());
+ return s;
+ }
+
+ @Override
+ public WebRequest newWebRequest(HttpServletRequest servletRequest, String filterPath) {
+ if(!DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS) {
+ return super.newWebRequest(servletRequest, filterPath);
+ }
+
+ // else demo mode
+ try {
+ String uname = servletRequest.getParameter("user");
+ if (uname != null) {
+ servletRequest.getSession().invalidate();
+ }
+ } catch (Exception e) {
+ }
+ WebRequest request = super.newWebRequest(servletRequest, filterPath);
+ return request;
+ }
+
+ @Override
+ protected Module newIsisWicketModule() {
+ final Module isisDefaults = super.newIsisWicketModule();
+
+ final Module overrides = new AbstractModule() {
+ @Override
+ protected void configure() {
+ bind(String.class).annotatedWith(Names.named("applicationName")).toInstance("Simple App");
+ bind(String.class).annotatedWith(Names.named("applicationCss")).toInstance("css/application.css");
+ bind(String.class).annotatedWith(Names.named("applicationJs")).toInstance("scripts/application.js");
+ bind(String.class).annotatedWith(Names.named("welcomeMessage")).toInstance(readLines(getClass(), "welcome.html"));
+ bind(String.class).annotatedWith(Names.named("aboutMessage")).toInstance("Simple App");
+ bind(InputStream.class).annotatedWith(Names.named("metaInfManifest")).toProvider(Providers.of(getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF")));
+ }
+ };
+
+ return Modules.override(isisDefaults).with(overrides);
+ }
+
+ private static String readLines(final Class<?> contextClass, final String resourceName) {
+ try {
+ List<String> readLines = Resources.readLines(Resources.getResource(contextClass, resourceName), Charset.defaultCharset());
+ final String aboutText = Joiner.on("\n").join(readLines);
+ return aboutText;
+ } catch (IOException e) {
+ return "This is a simple app";
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn
new file mode 100644
index 0000000..37543c9
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png
new file mode 100644
index 0000000..cd9ecfe
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html b/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html
new file mode 100644
index 0000000..49cfbcd
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<p class="intro">
+ <a href="http://isis.apache.org" target="_blank">Apache Isis</a>™ is a platform to let you rapidly develop
+ domain-driven apps in Java.
+ <br/>
+ <br/>
+ This app has been generated using Isis'
+ <a href="http://isis.apache.org/intro/getting-started/simple%61pp-archetype.html" target="_blank">SimpleApp</a> archetype,
+ which configures Isis' most commonly used components as part of a very simple and purposefully minimal application.
+ <br/>
+ <br/>
+ The app itself consists of a single domain class, <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObject.java" target="_blank">SimpleObject</a>,
+ along with an equally simple (factory/repository) domain service, <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObjects.java" target="_blank">SimpleObjects</a>.
+ <br/>
+ <br/>
+ For more details, see the <a href="http://isis.apache.org/documentation.html" target="_blank">Isis website</a>.
+</p>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties
new file mode 100644
index 0000000..1f2c12c
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -0,0 +1,233 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+
+#################################################################################
+#
+# specify system components.
+#
+# The values correspond to the named components in the installer-registry.properties file
+# in the org.apache.isis.core:isis-core-runtime JAR (in the org.apache.isis.core.runtime package)
+#
+# Although all configuration could reside in isis.properties, the recommendation is
+# to split out into component specific files:
+#
+# xxx_yyy.properties files
+#
+# where
+# * xxx is the component type, and
+# * yyy is the component name.
+#
+# For example, viewer_wicket.properties holds configuration information specific to the Wicket viewer.
+#
+#################################################################################
+
+
+#
+# configure the persistor (object store) to use
+#
+
+# JDO/DataNucleus objectstore
+isis.persistor=datanucleus
+
+
+
+#
+# configure authentication mechanism to use (to logon to the system)
+#
+
+#isis.authentication=bypass
+isis.authentication=shiro
+
+
+#
+# configure authorization mechanism to use
+#
+
+#isis.authorization=bypass
+isis.authorization=shiro
+
+
+
+
+
+#################################################################################
+#
+# MetaModel
+#
+# The metamodel typically does not require additional configuration, although
+# the system components (defined above) may refine the metamodel for their needs.
+#
+#################################################################################
+
+
+#
+# additional programming model facets
+#
+
+#isis.reflector.facets.include=
+#isis.reflector.facets.exclude=
+
+
+#
+# metamodel validator
+#
+
+#isis.reflector.validator=
+
+
+
+#
+# layoutMetadataReader(s)
+#
+
+# isis.reflector.layoutMetadataReaders=org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson
+
+
+
+#
+# patterns for applying CssClassFa facet (font-awesome icons) to member names
+#
+isis.reflector.facet.cssClassFa.patterns=new.*\:fa-plus,add.*\:fa-plus-square,create.*\:fa-plus,update.*\:fa-edit,change.*\:fa-edit,remove.*\:fa-minus-square,move.*\:fa-exchange,first.*\:fa-star,find.*\:fa-search,lookup.*\:fa-search,clear.*\:fa-remove,previous.*\:fa-step-backward,next.*\:fa-step-forward,list.*\:fa-list, all.*\:fa-list, download.*\:fa-download, upload.*\:fa-upload, execute.*\:fa-bolt, run.*\:fa-bolt, calculate.*\:fa-calculator, verify.*\:fa-check-circle, refresh.*\:fa-refresh, install.*\:fa-wrench
+ new.*:fa-plus,\
+ add.*:fa-plus-square,\
+ create.*:fa-plus,\
+ update.*:fa-edit,\
+ change.*:fa-edit,\
+ remove.*:fa-minus-square,\
+ move.*:fa-exchange,\
+ first.*:fa-star,\
+ find.*:fa-search,\
+ lookup.*:fa-search,\
+ clear.*:fa-remove,\
+ previous.*:fa-step-backward,\
+ next.*:fa-step-forward,\
+ list.*:fa-list, \
+ all.*:fa-list, \
+ download.*:fa-download, \
+ upload.*:fa-upload, \
+ execute.*:fa-bolt, \
+ run.*:fa-bolt, \
+ calculate.*:fa-calculator, \
+ verify.*:fa-check-circle, \
+ refresh.*:fa-refresh, \
+ install.*:fa-wrench
+
+
+isis.reflector.facet.cssClass.patterns=update.*\:btn-default,delete.*\:btn-warning,.*\:btn-primary
+ update.*:btn-default,\
+ delete.*:btn-warning,\
+ .*:btn-primary
+
+
+
+#################################################################################
+#
+# Value facet defaults
+#
+# (see also viewer-specific config files, eg viewer_wicket.properties)
+#
+#################################################################################
+
+# as used by @Title of a date
+isis.value.format.date=dd-MM-yyyy
+
+
+
+#################################################################################
+#
+# Facet Decorators
+#
+#################################################################################
+
+#
+# Providing such capabilities as i18n
+#
+
+isis.reflector.facet-decorators=org.apache.isis.core.metamodel.facetdecorator.i18n.resourcebundle.I18nDecoratorUsingResourceBundleInstaller
+
+
+#################################################################################
+#
+# Application Services and fixtures
+#
+#################################################################################
+
+#
+# Specify the domain services.
+#
+# These are the most important configuration properties in the system, as they define
+# the set of the classes for Isis to instantiate as domain service singletons.
+# From these domain service instances the rest of the metamodel is discovered, while the
+# end-user gains access to other domain objects by invoking the actions of the domain services.
+#
+isis.services-installer=configuration-and-annotation
+isis.services.ServicesInstallerFromAnnotation.packagePrefix=dom.simple,fixture.simple,webapp.prototyping
+ fixture.simple,\
+ webapp.prototyping
+
+isis.services = org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,\
+ com.sprint.isis.neo4j.server.Wrapper, \
+ # customizable exception handling, \
+ org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
+ org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,
+
+
+# Specify the (optional) test fixtures
+#
+# Fixtures are used to seed the object store with an initial set of data. For the
+# in-memory object store, the fixtures are installed on every run. For other
+# object stores, they are used only when the object store is first initialized.
+#
+isis.fixtures=fixture.simple.scenario.SimpleObjectsFixture
+
+
+#
+# whether ExceptionRecognizers should also log any recognized exceptions
+# (default false; enable for diagnostics/debugging)
+#
+#isis.services.exceprecog.logRecognizedExceptions=true
+
+
+#
+# Audit changes to all objects; can opt out using @Audited(disabled=true)
+#
+#isis.services.audit.objects=all|none
+
+#
+# Treat all actions as commands; can opt out using @Command(disabled=true)
+#
+#isis.services.command.actions=all|none|ignoreQueryOnly
+
+
+
+
+################################################################################
+#
+# Viewer defaults
+#
+#################################################################################
+
+#
+# Specify viewer defaults
+#
+#isis.viewers.paged.standalone=30
+#isis.viewers.paged.parented=10
+
+
+#isis.viewers.propertyLayout.labelPosition=LEFT
+#isis.viewers.parameterLayout.labelPosition=LEFT
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties
new file mode 100644
index 0000000..0467c62
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties
@@ -0,0 +1,185 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+
+#
+# Isis uses log4j is used to provide system logging
+#
+log4j.rootCategory=INFO, Console
+#log4j.rootCategory=DEBUG, Console
+
+
+# The console appender
+log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.target=System.out
+log4j.appender.Console.layout=org.apache.log4j.PatternLayout
+log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n
+
+
+# The stderr appender
+log4j.appender.Stderr=org.apache.log4j.ConsoleAppender
+log4j.appender.Stderr.target=System.err
+log4j.appender.Stderr.layout=org.apache.log4j.PatternLayout
+log4j.appender.Stderr.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n
+
+
+# other appenders
+log4j.appender.File=org.apache.log4j.RollingFileAppender
+log4j.appender.File.file=isis.log
+log4j.appender.File.append=false
+log4j.appender.File.layout=org.apache.log4j.PatternLayout
+log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p] %m%n
+
+log4j.appender.sql=org.apache.log4j.FileAppender
+log4j.appender.sql.File=./logs/sql.log
+log4j.appender.sql.Append=false
+log4j.appender.sql.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n
+
+log4j.appender.sqltiming=org.apache.log4j.FileAppender
+log4j.appender.sqltiming.File=./logs/sqltiming.log
+log4j.appender.sqltiming.Append=false
+log4j.appender.sqltiming.layout=org.apache.log4j.PatternLayout
+log4j.appender.sqltiming.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n
+
+log4j.appender.jdbc=org.apache.log4j.FileAppender
+log4j.appender.jdbc.File=./logs/jdbc.log
+log4j.appender.jdbc.Append=false
+log4j.appender.jdbc.layout=org.apache.log4j.PatternLayout
+log4j.appender.jdbc.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
+
+log4j.appender.connection=org.apache.log4j.FileAppender
+log4j.appender.connection.File=./logs/connection.log
+log4j.appender.connection.Append=false
+log4j.appender.connection.layout=org.apache.log4j.PatternLayout
+log4j.appender.connection.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
+
+
+
+
+
+! turn on the internal log4j debugging flag so we can see what it is doing
+#log4j.debug=true
+
+
+# DataNucleus
+# the first two log the DML and DDL (if set to DEBUG)
+log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console
+log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console
+# the remainder can probably be left to WARN
+log4j.logger.DataNucleus.Persistence=WARN, Console
+log4j.logger.DataNucleus.Transaction=WARN, Console
+log4j.logger.DataNucleus.Connection=WARN, Console
+log4j.logger.DataNucleus.Query=WARN, Console
+log4j.logger.DataNucleus.Cache=WARN, Console
+log4j.logger.DataNucleus.MetaData=WARN, Console
+log4j.logger.DataNucleus.Datastore=WARN, Console
+log4j.logger.DataNucleus.Datastore.Persist=WARN, Console
+log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console
+log4j.logger.DataNucleus.General=WARN, Console
+log4j.logger.DataNucleus.Lifecycle=WARN, Console
+log4j.logger.DataNucleus.ValueGeneration=WARN, Console
+log4j.logger.DataNucleus.Enhancer=WARN, Console
+log4j.logger.DataNucleus.SchemaTool=ERROR, Console
+log4j.logger.DataNucleus.JDO=WARN, Console
+log4j.logger.DataNucleus.JPA=ERROR, Console
+log4j.logger.DataNucleus.JCA=WARN, Console
+log4j.logger.DataNucleus.IDE=ERROR, Console
+
+log4j.additivity.DataNucleus.Datastore.Native=false
+log4j.additivity.DataNucleus.Datastore.Schema=false
+log4j.additivity.DataNucleus.Datastore.Persistence=false
+log4j.additivity.DataNucleus.Datastore.Transaction=false
+log4j.additivity.DataNucleus.Datastore.Connection=false
+log4j.additivity.DataNucleus.Datastore.Query=false
+log4j.additivity.DataNucleus.Datastore.Cache=false
+log4j.additivity.DataNucleus.Datastore.MetaData=false
+log4j.additivity.DataNucleus.Datastore.Datastore=false
+log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false
+log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false
+log4j.additivity.DataNucleus.Datastore.General=false
+log4j.additivity.DataNucleus.Datastore.Lifecycle=false
+log4j.additivity.DataNucleus.Datastore.ValueGeneration=false
+log4j.additivity.DataNucleus.Datastore.Enhancer=false
+log4j.additivity.DataNucleus.Datastore.SchemaTool=false
+log4j.additivity.DataNucleus.Datastore.JDO=false
+log4j.additivity.DataNucleus.Datastore.JPA=false
+log4j.additivity.DataNucleus.Datastore.JCA=false
+log4j.additivity.DataNucleus.Datastore.IDE=false
+
+
+# if using log4jdbc-remix as JDBC driver
+#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console
+#log4j.additivity.jdbc.sqlonly=false
+#log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console
+#log4j.additivity.jdbc.resultsettable=false
+
+#log4j.logger.jdbc.audit=WARN,jdbc, Console
+#log4j.additivity.jdbc.audit=false
+#log4j.logger.jdbc.resultset=WARN,jdbc
+#log4j.additivity.jdbc.resultset=false
+#log4j.logger.jdbc.sqltiming=WARN,sqltiming
+#log4j.additivity.jdbc.sqltiming=false
+#log4j.logger.jdbc.connection=FATAL,connection
+#log4j.additivity.jdbc.connection=false
+
+
+
+# track Isis/JDO lifecycle integration
+
+#log4j.logger.org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.persistence.FrameworkSynchronizer=DEBUG, Console
+#log4j.additivity.org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.persistence.FrameworkSynchronizer=false
+
+#log4j.logger.org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener=DEBUG,Console
+#log4j.additivity.org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener=false
+
+
+
+
+# track Isis/Wicket lifecycle integration
+
+#log4j.logger.org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis=DEBUG, Console
+#log4j.additivity.org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis=false
+
+#log4j.logger.org.apache.isis.viewer.wicket.viewer.integration.isis.IsisContextForWicket=INFO,Console
+#log4j.additivity.org.apache.isis.viewer.wicket.viewer.integration.isis.IsisContextForWicket=false
+
+
+
+
+# quieten some of the noisier classes in Isis' bootstrapping
+log4j.logger.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=WARN,Console
+log4j.additivity.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=false
+
+log4j.logger.org.apache.isis.core.metamodel.specloader.ServiceInitializer=WARN,Console
+log4j.additivity.org.apache.isis.core.metamodel.specloader.ServiceInitializer=false
+
+log4j.logger.org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration=WARN,Console
+log4j.additivity.org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration=false
+
+log4j.logger.org.apache.isis.core.commons.config.IsisConfigurationDefault=WARN,Console
+log4j.additivity.org.apache.isis.core.commons.config.IsisConfigurationDefault=false
+
+log4j.logger.org.apache.isis.core.runtime.installers.InstallerLookupDefault=WARN,Console
+log4j.additivity.org.apache.isis.core.runtime.installers.InstallerLookupDefault=false
+
+
+
+
+# Application-specific logging
+log4j.logger.dom.todo.ToDoItem=DEBUG, Stderr
+log4j.additivity.dom.todo.ToDoItem=false
\ No newline at end of file
[17/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
deleted file mode 100644
index c1a01b4..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.debug.DebugHtmlString;
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.commons.debug.DebuggableWithTitle;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
-import org.apache.isis.core.metamodel.util.Dump;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Debug extends AbstractElementProcessor {
-
- private final Dispatcher dispatcher;
-
- public Debug(final Dispatcher dispatcher) {
- this.dispatcher = dispatcher;
- }
-
- @Override
- public void process(final Request request) {
- if (request.getContext().isDebugDisabled()) {
- return;
- }
-
- final String type = request.getOptionalProperty(TYPE);
-
- final boolean alwaysShow = request.isRequested("force", false);
- if (type != null) {
- if (type.equals("system")) {
- displaySystem(request);
- } else if (type.equals("session")) {
- displaySession(request);
- } else if (type.equals("test")) {
- final DebugBuilder debug = new DebugHtmlString();
- debug.appendTitle("Title");
- debug.appendln("boolean", true);
- debug.appendln("number", 213);
- debug.startSection("Section 1");
- debug.appendln("boolean", false);
- debug.appendln("number", 12348);
- debug.endSection();
- debug.startSection("Section 2");
- debug.appendln("boolean", false);
- debug.appendln("number", 12348);
- debug.appendTitle("Another title");
- debug.appendln("boolean", false);
- debug.appendln("number", 12348);
- debug.endSection();
-
- debug.startSection("Section 3");
- debug.appendln("boolean", false);
- debug.appendln("number", 89878);
- debug.endSection();
- debug.startSection("Subsection 2");
- debug.appendln("boolean", false);
- debug.appendln("number", 12348);
- debug.endSection();
-
- debug.startSection("Section 4");
- debug.appendln("boolean", false);
- debug.indent();
- debug.appendln("boolean", false);
- debug.appendln("number", 12348);
- debug.unindent();
- debug.appendln("number", 12348);
- debug.appendPreformatted("code", "line 1\nline 2\nline 3");
- debug.appendln("A lot of text etc.");
- debug.endSection();
-
- request.appendHtml(debug.toString());
- //request.appendHtml("<pre>" + debug.toString() + "</pre>");
-
- debug.close();
-
- } else if (type.equals("variables")) {
- displayVariables(request);
- } else if (type.equals("dispatcher")) {
- displayDispatcher(request);
- } else if (type.equals("context")) {
- displayContext(request);
- } else if (type.equals("specifications")) {
- listSpecifications(request);
- } else if (type.equals("specification-for")) {
- specificationFor(request);
- } else if (type.equals("specification")) {
- specification(request);
- } else if (type.equals("specification-graph")) {
- specificationGraph(request);
- } else if (type.equals("object-graph")) {
- objectGraph(request);
-
- } else if (type.equals("object")) {
- final String value = request.getOptionalProperty(VALUE);
- final RequestContext context = request.getContext();
- final ObjectAdapter object = context.getMappedObject(value);
- final DebugString str = new DebugString();
- Dump.adapter(object, str);
- Dump.graph(object, IsisContext.getAuthenticationSession(), str);
- request.appendHtml("<h2>" + object.getSpecification().getFullIdentifier() + "</h2>");
- request.appendHtml("<pre class=\"debug\">" + str + "</pre>");
- }
-
- }
-
- if (alwaysShow || request.getContext().getDebug() == RequestContext.Debug.ON) {
-
- final RequestContext context = request.getContext();
-
- final String id = request.getOptionalProperty("object");
- if (id != null) {
- final ObjectAdapter object = context.getMappedObject(id);
- if (object instanceof DebuggableWithTitle) {
- final DebugString debug = new DebugString();
- ((DebuggableWithTitle) object).debugData(debug);
- request.appendHtml("<pre class=\"debug\">" + debug + "</pre>");
- } else {
- request.appendHtml(object.toString());
- }
- }
-
- final String variable = request.getOptionalProperty("variable");
- if (variable != null) {
- final Object object = context.getVariable(variable);
- request.appendHtml(variable + " => " + (object == null ? "null" : object.toString()));
- }
-
- final String list = request.getOptionalProperty("list");
- if (list != null) {
- final DebugString debug = new DebugString();
- context.append(debug, list);
- request.appendHtml(debug.toString());
- }
-
- final String uri = request.getOptionalProperty("uri");
- if (uri != null) {
- request.appendHtml("<pre class=\"debug\">");
- request.appendHtml(context.getUri());
- request.appendHtml("</pre>");
- }
-
- }
- }
-
- protected void objectGraph(final Request request) {
- final String id = request.getOptionalProperty(VALUE);
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
- request.appendHtml("<h1>Object Graph - " + object + "</h1>");
- request.appendHtml("<pre>");
- final DebugBuilder debug = new DebugString();
- Dump.graph(object, null, debug);
- request.appendHtml(debug.toString());
- request.appendHtml("</pre>");
- }
-
- protected void specificationFor(final Request request) {
- final String id = request.getOptionalProperty(VALUE);
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
- specification(request, object.getSpecification());
- }
-
- protected void specification(final Request request) {
- final String name = request.getOptionalProperty(VALUE);
- final ObjectSpecification spec = getSpecificationLoader().loadSpecification(name);
- specification(request, spec);
- }
-
- private void specification(final Request request, final ObjectSpecification spec) {
- request.appendHtml("<h1>Specification - " + spec.getFullIdentifier() + "</h1>");
- request.appendHtml("<p><a href=\"./debug.shtml?type=specification-graph&value=" + spec.getFullIdentifier() + "\">Specification Graph</a></p>");
- final DebugBuilder debug = new DebugHtmlString();
- specification(spec, debug);
- request.appendHtml(debug.toString());
- }
-
- protected void specificationGraph(final Request request) {
- final String name = request.getOptionalProperty(VALUE);
- final ObjectSpecification spec = getSpecificationLoader().loadSpecification(name);
- request.appendHtml("<h1>Specification Graph - " + spec.getFullIdentifier() + "</h1>");
- request.appendHtml("<p><a href=\"./debug.shtml?type=specification&value=" + spec.getFullIdentifier() + "\">Full Specification</a></p>");
- request.appendHtml("<pre>");
- final DebugBuilder debug = new DebugString();
- debug.appendln(spec.getFullIdentifier());
- debug.indent();
- specificationGraph(spec, debug, new ArrayList<ObjectSpecification>());
- debug.unindent();
- request.appendHtml(debug.toString());
- request.appendHtml("</pre>");
- }
-
- private void displayContext(final Request request) {
- request.appendHtml("<h1>Context</h1>");
- final DebugHtmlString debugString = new DebugHtmlString();
- request.getContext().append(debugString);
- debugString.close();
- request.appendHtml(debugString.toString());
- }
-
- private void displayDispatcher(final Request request) {
- request.appendHtml("<h1>Dispatcher</h1>");
- final DebugHtmlString debugString = new DebugHtmlString();
- dispatcher.debug(debugString);
- debugString.close();
- request.appendHtml(debugString.toString());
- }
-
- protected void displayVariables(final Request request) {
- request.appendHtml("<h1>Variables</h1>");
- final DebugHtmlString debug = new DebugHtmlString();
- final RequestContext context = request.getContext();
- context.append(debug, "variables");
- debug.close();
- request.appendHtml(debug.toString());
- }
-
- protected void displaySystem(final Request request) {
- request.appendHtml("<h1>System</h1>");
- final DebuggableWithTitle[] debugItems = IsisContext.debugSystem();
- for (final DebuggableWithTitle debug : debugItems) {
- final DebugHtmlString debugBuffer = new DebugHtmlString();
- debugBuffer.startSection(debug.debugTitle());
- debug.debugData(debugBuffer);
- debugBuffer.endSection();
- debugBuffer.close();
- request.appendHtml(debugBuffer.toString());
- }
- }
-
- protected void displaySession(final Request request) {
- request.appendHtml("<h1>Session</h1>");
- final DebuggableWithTitle[] debugItems = IsisContext.debugSession();
- for (final DebuggableWithTitle debug : debugItems) {
- final DebugHtmlString debugBuffer = new DebugHtmlString();
- debugBuffer.startSection(debug.debugTitle());
- debug.debugData(debugBuffer);
- debugBuffer.endSection();
- debugBuffer.close();
- request.appendHtml(debugBuffer.toString());
- }
- }
-
- protected void listSpecifications(final Request request) {
- request.appendHtml("<h1>Specifications</h1>");
- final List<ObjectSpecification> fullIdentifierList = new ArrayList<ObjectSpecification>(getSpecificationLoader().allSpecifications());
- Collections.sort(fullIdentifierList, ObjectSpecification.COMPARATOR_SHORT_IDENTIFIER_IGNORE_CASE);
- final DebugHtmlString debug = new DebugHtmlString();
- for (final ObjectSpecification spec : fullIdentifierList) {
- final String name = spec.getSingularName();
- debug.appendln(name, specificationLink(spec));
- }
- debug.close();
- request.appendHtml(debug.toString());
- }
-
- private String specificationLink(final ObjectSpecification specification) {
- if (specification == null) {
- return "none";
- } else {
- final String name = specification.getFullIdentifier();
- return "<a href=\"./debug.shtml?type=specification&value=" + name + "\">" + name + "</a>";
- }
- }
-
- protected SpecificationLoaderSpi getSpecificationLoader() {
- return IsisContext.getSpecificationLoader();
- }
-
- @Override
- public String getName() {
- return "debug";
- }
-
- private void specificationGraph(final ObjectSpecification spec, final DebugBuilder view, final ArrayList<ObjectSpecification> visited) {
- final List<ObjectAssociation> fields = new ArrayList<ObjectAssociation>(spec.getAssociations(Contributed.EXCLUDED));
- Collections.sort(fields, new Comparator<ObjectAssociation>() {
- @Override
- public int compare(final ObjectAssociation o1, final ObjectAssociation o2) {
- return o1.getName().compareTo(o2.getName());
- }
- });
- for (int i = 0; i < fields.size(); i++) {
- final ObjectAssociation field = fields.get(i);
- final ObjectSpecification specification = field.getSpecification();
- if (!specification.isValue()) {
- final boolean contains = visited.contains(specification);
- final String aggregated = specification.isParented() ? "++" : "";
- view.appendln(aggregated + field.getName() + " (<a href=\"./debug.shtml?type=specification-graph&value=" + specification.getFullIdentifier() + "\">" + specification.getFullIdentifier() + "</a>" + (contains ? "..." : "") + ")");
- if (!contains) {
- visited.add(specification);
- view.indent();
- specificationGraph(specification, view, visited);
- view.unindent();
- }
- }
- }
-
- }
-
- private void specification(final ObjectSpecification spec, final DebugBuilder view) {
- view.startSection("Summary");
- view.appendln("Hash code", "#" + Integer.toHexString(spec.hashCode()));
- view.appendln("ID", spec.getIdentifier());
- view.appendln("Full name", spec.getFullIdentifier());
- view.appendln("Short name", spec.getShortIdentifier());
- view.appendln("Singular name", spec.getSingularName());
- view.appendln("Plural name", spec.getPluralName());
- view.appendln("Description", spec.getDescription());
-
- view.appendln("Type", "?");
- view.appendln("Value/aggregated", String.valueOf(!spec.isValueOrIsParented()));
-
- view.appendln("Parent specification", specificationLink(spec.superclass()));
- specificationClasses(view, "Child specifications", spec.subclasses());
- specificationClasses(view, "Implemented interfaces", spec.interfaces());
- speficationFacets(view, spec);
-
- final List<ObjectAssociation> fields = spec.getAssociations(Contributed.EXCLUDED);
- specificationMembers(view, "Fields", fields);
- final List<ObjectAction> userActions = spec.getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
- specificationMembers(view, "User Actions", userActions);
- specificationMembers(view, "Exploration Actions", spec.getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED, Filters.<ObjectAction>any()));
- specificationMembers(view, "Prototype Actions", spec.getObjectActions(ActionType.PROTOTYPE, Contributed.INCLUDED, Filters.<ObjectAction>any()));
- specificationMembers(view, "Debug Actions", spec.getObjectActions(ActionType.DEBUG, Contributed.INCLUDED, Filters.<ObjectAction>any()));
- view.endSection();
-
- view.startSection("Fields");
- for (int i = 0; i < fields.size(); i++) {
- final ObjectAssociation field = fields.get(i);
- view.appendTitle("<span id=\"" + field.getId() + "\"><em>Field:</em> " + field.getId() + "</span>");
- view.appendln("ID", field.getIdentifier());
- view.appendln("Short ID", field.getId());
- view.appendln("Name", field.getName());
- view.appendln("Specification", specificationLink(field.getSpecification()));
-
- view.appendln("Type", field.isOneToManyAssociation() ? "Collection" : field.isOneToOneAssociation() ? "Object" : "Unknown");
- view.appendln("Flags", (field.isAlwaysHidden() ? "" : "Visible ") + (field.isNotPersisted() ? "Not-Persisted " : " ") + (field.isMandatory() ? "Mandatory " : ""));
-
- speficationFacets(view, field);
- }
- view.endSection();
-
- view.startSection("Actions");
- for (int i = 0; i < userActions.size(); i++) {
- final ObjectAction action = userActions.get(i);
- view.appendTitle("<span id=\"" + action.getId() + "\"><em>Action:</em> " + action.getId() + "</span>");
- view.appendln("ID", action.getIdentifier());
- view.appendln("Short ID", action.getId());
- view.appendln("Name", action.getName());
- view.appendln("Specification", specificationLink(action.getSpecification()));
-
- view.appendln("On type", specificationLink(action.getOnType()));
-
- final ObjectSpecification returnType = action.getReturnType();
- view.appendln("Returns", returnType == null ? "VOID" : specificationLink(returnType));
-
- speficationFacets(view, action);
-
- final List<ObjectActionParameter> parameters = action.getParameters();
- if (parameters.size() == 0) {
- view.appendln("Parameters", "none");
- } else {
- final StringBuffer buffer = new StringBuffer();
- final List<ObjectActionParameter> p = action.getParameters();
- for (int j = 0; j < parameters.size(); j++) {
- buffer.append(p.get(j).getName());
- buffer.append(" (");
- buffer.append(specificationLink(parameters.get(j).getSpecification()));
- buffer.append(")");
- view.appendln("Parameters", buffer.toString());
-
- view.indent();
- final Class<? extends Facet>[] parameterFacets = p.get(j).getFacetTypes();
- for (final Class<? extends Facet> parameterFacet : parameterFacets) {
- view.append(p.get(j).getFacet(parameterFacet).toString());
- }
- view.unindent();
- }
- }
- }
- }
-
- private void specificationClasses(final DebugBuilder view, final String label, final List<ObjectSpecification> subclasses) {
- final StringBuffer buffer = new StringBuffer();
- if (subclasses.size() == 0) {
- buffer.append("none");
- } else {
- for (int i = 0; i < subclasses.size(); i++) {
- buffer.append(specificationLink(subclasses.get(i)) + "<br>");
- }
- }
- view.appendln(label, buffer.toString());
- }
-
- private void specificationMembers(final DebugBuilder view, final String label, final List<? extends ObjectMember> members) {
- final StringBuffer buffer = new StringBuffer();
- if (members.size() == 0) {
- buffer.append("none");
- } else {
- for (int i = 0; i < members.size(); i++) {
- final ObjectMember member = members.get(i);
- buffer.append("<a href=\"#" + members.get(i).getId() + "\">" + member.getId() + "</a> <small>");
- buffer.append(member.isAlwaysHidden() ? "" : "Visible ");
- if (member.isPropertyOrCollection()) {
- buffer.append(((ObjectAssociation) member).isNotPersisted() ? "Not-Persisted " : " ");
- buffer.append(((ObjectAssociation) member).isMandatory() ? "Mandatory " : "");
- }
- buffer.append("</small></a><br>");
- }
- }
- view.appendln(label, buffer.toString());
- }
-
- private void speficationFacets(final DebugBuilder view, final FacetHolder facetHolder) {
- final List<Facet> facets = facetHolder.getFacets(new Filter<Facet>() {
- @Override
- public boolean accept(final Facet facet) {
- return true;
- }
- });
- final StringBuffer buffer = new StringBuffer();
- if (facets == null || facets.size() == 0) {
- buffer.append("none");
- } else {
- Collections.sort(facets, new Comparator<Facet>() {
- @Override
- public int compare(final Facet o1, final Facet o2) {
- final String facetType1 = o1.facetType().getName();
- final String facetType2 = o2.facetType().getName();
- return facetType1.substring(facetType1.lastIndexOf('.') + 1).compareTo(facetType2.substring(facetType2.lastIndexOf('.') + 1));
- }
- });
- for (final Facet facet : facets) {
- final String facetType = facet.facetType().getName();
- buffer.append("<span class=\"facet-type\">" + facetType.substring(facetType.lastIndexOf('.') + 1) + "</span>: " + facet + "<br>");
- }
- }
- view.appendln("Facets", buffer.toString());
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugAccessCheck.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugAccessCheck.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugAccessCheck.java
deleted file mode 100644
index 796faf0..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugAccessCheck.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class DebugAccessCheck extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- if (request.getContext().isDebugDisabled()) {
- throw new ForbiddenException("Debug is disabled");
- }
- }
-
- @Override
- public String getName() {
- return "debug-access-check";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugCollectionView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugCollectionView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugCollectionView.java
deleted file mode 100644
index 9137783..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugCollectionView.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
-
-public class DebugCollectionView extends AbstractObjectProcessor {
-
- @Override
- public void process(final Request request, final ObjectAdapter object) {
- final String cls = request.getOptionalProperty(CLASS, "form");
- final String classString = " class=\"" + cls + "\"";
- String title = request.getOptionalProperty(FORM_TITLE);
- final String oddRowClass = request.getOptionalProperty(ODD_ROW_CLASS);
- final String evenRowClass = request.getOptionalProperty(EVEN_ROW_CLASS);
- final boolean showIcons = request.isRequested(SHOW_ICON, true);
-
- }
-
- private void write(final Request request, final ObjectAdapter object, final List<ObjectAssociation> fields,
- final LinkedObject[] linkFields, final String classString, final String title, final String oddRowClass,
- final String evenRowClass, final boolean showIcons) {
- request.appendHtml("<div" + classString + ">");
- if (title != null) {
- request.appendHtml("<div class=\"title\">");
- request.appendAsHtmlEncoded(title);
- request.appendHtml("</div>");
- HelpLink.append(request, object.getSpecification().getDescription(), object.getSpecification().getHelp());
- }
- /*
- final List<ObjectAssociation> fields =
- tag.includedFields(object.getSpecification().getAssociations(
- ObjectAssociationFilters.STATICALLY_VISIBLE_ASSOCIATIONS));
- final LinkedObject[] linkFields = tag.linkedFields(fields);
-
- String linkAllView = request.getOptionalProperty(LINK);
- if (linkAllView != null) {
- linkAllView = request.getContext().fullUriPath(linkAllView);
- for (int i = 0; i < linkFields.length; i++) {
- final boolean isObject = fields.get(i).isOneToOneAssociation();
- final boolean isNotParseable =
- !fields.get(i).getSpecification().containsFacet(ParseableFacet.class);
- linkFields[i] = isObject && isNotParseable ? new LinkedObject(linkAllView) : null;
- }
- }
-
-
-
- int row = 1;
- for (int i = 0; i < fields.size(); i++) {
- final ObjectAssociation field = fields.get(i);
- if (ignoreField(field)) {
- continue;
- }
- if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) {
- continue;
- }
-
- final String description =
- field.getDescription().equals("") ? "" : "title=\"" + field.getDescription() + "\"";
- String cls;
- if (row++ % 2 == 1) {
- cls = " class=\"field " + (oddRowClass == null ? ODD_ROW_CLASS : oddRowClass) + "\"";
- } else {
- cls = " class=\"field " + (evenRowClass == null ? EVEN_ROW_CLASS : evenRowClass) + "\"";
- }
- request.appendHtml("<div " + cls + description + "><span class=\"label\">");
- request.appendAsHtmlEncoded(field.getName());
- request.appendHtml(":</span>");
- final LinkedObject linkedObject = linkFields[i];
- addField(request, object, field, linkedObject, showIcons);
- HelpLink.append(request, field.getDescription(), field.getHelp());
- request.appendHtml("</div>");
- }
- */
- request.appendHtml("</div>");
-
- }
-
-
- @Override
- public String getName() {
- return "debug-collection";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
deleted file mode 100644
index 020377d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.FieldValue;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
-
-
-public class DebugObjectView extends AbstractObjectProcessor {
-
- @Override
- public void process(final Request request, final ObjectAdapter object) {
- final String classString = " class=\"" + request.getOptionalProperty(CLASS, "form debug") + "\"";
- final String objectLink = request.getOptionalProperty(OBJECT + "-" + LINK_VIEW, request.getViewPath());
- // final String collectionLink = request.getOptionalProperty(COLLECTION + "-" + LINK_VIEW, request.getViewPath());
- final String oddRowClass = request.getOptionalProperty(ODD_ROW_CLASS);
- final String evenRowClass = request.getOptionalProperty(EVEN_ROW_CLASS);
- final boolean showIcons = request.isRequested(SHOW_ICON, true);
-
- ObjectSpecification specification = object.getSpecification();
-
- request.appendHtml("<div" + classString + ">");
- request.appendHtml("<div class=\"title\">");
- request.appendAsHtmlEncoded(specification.getSingularName() + " - " + specification.getFullIdentifier());
- request.appendHtml("</div>");
-
- Version version = object.getVersion();
- request.appendHtml("<div class=\"version\">");
- request.appendAsHtmlEncoded("#" + version.sequence() + " - " + version.getUser() + " (" + version.getTime() + ")" );
- request.appendHtml("</div>");
-
- final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.ALL);
-
- int row = 1;
- for (int i = 0; i < fields.size(); i++) {
- final ObjectAssociation field = fields.get(i);
- /*
- * if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) { continue; }
- */
- String cls;
- if (row++ % 2 == 1) {
- cls = " class=\"field " + (oddRowClass == null ? ODD_ROW_CLASS : oddRowClass) + "\"";
- } else {
- cls = " class=\"field " + (evenRowClass == null ? EVEN_ROW_CLASS : evenRowClass) + "\"";
- }
- request.appendHtml("<div " + cls + "><span class=\"label\">");
- request.appendAsHtmlEncoded(field.getName());
- request.appendHtml(":</span>");
-
- final boolean isNotParseable =
- !fields.get(i).getSpecification().containsFacet(ParseableFacet.class);
- LinkedObject linkedObject = null;
- if (isNotParseable) {
- // linkedObject = new LinkedObject(field.isOneToManyAssociation() ? collectionLink : objectLink);
- linkedObject = new LinkedObject(objectLink);
- }
- addField(request, object, field, linkedObject, showIcons);
-
- if (field.isOneToManyAssociation()) {
- Collection collection = (Collection) field.get(object).getObject();
- if (collection.size() == 0) {
- request.appendHtml("[empty]");
- } else {
- // request.appendHtml(collection.size() + " elements");
-
- request.appendHtml("<ol>");
-
- for (Object element : collection) {
- ObjectAdapter adapterFor = IsisContext.getPersistenceSession().getAdapterManager().getAdapterFor(element);
- IsisContext.getPersistenceSession().resolveImmediately(adapterFor);
-
- String id = request.getContext().mapObject(adapterFor, linkedObject.getScope(), Scope.INTERACTION);
-
- request.appendHtml("<li class=\"element\">");
- request.appendHtml("<a href=\"" + linkedObject.getForwardView() + "?" + linkedObject.getVariable() + "="
- + id + request.getContext().encodedInteractionParameters() + "\">");
- request.appendHtml(element.toString());
- request.appendHtml("</a></li>");
- }
- request.appendHtml("</ol>");
- }
- } else {
- FieldValue.write(request, object, field, linkedObject, "value", showIcons, 0);
- }
-
-
-
- request.appendHtml("</div>");
- }
- request.appendHtml("</div>");
- }
-
- protected void addField(
- final Request request,
- final ObjectAdapter object,
- final ObjectAssociation field,
- final LinkedObject linkedObject,
- final boolean showIcons) {
- }
-
- @Override
- public String getName() {
- return "debug-object";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebuggerLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebuggerLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebuggerLink.java
deleted file mode 100644
index 795d272..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebuggerLink.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class DebuggerLink extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- if (request.getContext().isDebugDisabled()) {
- request.skipUntilClose();
- return;
- }
-
- final RequestContext context = request.getContext();
- final Object result = context.getVariable(RequestContext.RESULT);
- request.appendHtml("<div class=\"debug\">");
- request.appendHtml("<a class=\"debug-link\" href=\"/debug/debug.shtml\" target=\"debug\" title=\"debug\" >...</a>");
- if (result != null) {
- request.appendHtml(" <a href=\"/debug/object.shtml?_result=" + result + "\" target=\"debug\" title=\"debug instance\">...</a>");
- }
- request.appendHtml(" <span class=\"debug-link\" onclick=\"$('#page-debug').toggle()\" alt=\"show/hide debug details\">...</span>");
- request.appendHtml("</div>");
-
- request.processUtilCloseTag();
- }
-
- @Override
- public String getName() {
- return "debugger";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Diagnostics.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Diagnostics.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Diagnostics.java
deleted file mode 100644
index 037812e..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Diagnostics.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.debug.DebugHtmlString;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Diagnostics extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- if (request.getContext().isDebugDisabled()) {
- return;
- }
-
- final String type = request.getOptionalProperty(TYPE, "page");
- final boolean isForced = request.isRequested("force");
- if (isForced || request.getContext().showDebugData()) {
- request.appendHtml("<div class=\"debug\">");
- if ("page".equals(type)) {
- request.appendHtml("<pre>");
- final RequestContext context = request.getContext();
- request.appendHtml("URI: " + context.getUri());
- request.appendHtml("\n");
- request.appendHtml("File: " + context.fullFilePath(context.getResourceFile()));
- final String result = (String) request.getContext().getVariable(RequestContext.RESULT);
- if (result != null) {
- request.appendHtml("\n");
- request.appendHtml("Object: " + result);
- }
- request.appendHtml("</pre>");
- } else if ("session".equals(type)) {
- request.appendHtml("<pre>");
- final AuthenticationSession session = IsisContext.getAuthenticationSession();
- request.appendHtml("Session: " + session.getUserName() + " " + session.getRoles());
- request.appendHtml("</pre>");
- } else if ("variables".equals(type)) {
- final RequestContext context = request.getContext();
- final DebugHtmlString debug = new DebugHtmlString();
- debug.appendln("", "");
- context.append(debug, "variables");
- debug.close();
- request.appendHtml(debug.toString());
- } else if ("processing".equals(type)) {
- request.appendHtml("<pre>");
- request.appendHtml(request.getContext().getDebugTrace());
- request.appendHtml("</pre>");
- } else {
- request.appendHtml("<i>No such type " + type + "</i>");
- }
- request.appendHtml("</div>");
- }
- }
-
- @Override
- public String getName() {
- return "diagnostics";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Log.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Log.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Log.java
deleted file mode 100644
index 92db889..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Log.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Log extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- String name = request.getRequiredProperty(NAME);
- Logger logger = LoggerFactory.getLogger(name);
-
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String message = request.popBuffer();
- logger.info(message);
- }
-
- @Override
- public String getName() {
- return "log";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/LogLevel.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/LogLevel.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/LogLevel.java
deleted file mode 100644
index 66e2d6d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/LogLevel.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class LogLevel extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
-
- String view = request.getOptionalProperty(VIEW, request.getViewPath());
- view = request.getContext().fullFilePath(view);
- final org.apache.log4j.Level level = org.apache.log4j.LogManager.getRootLogger().getLevel();
- final boolean showSelector = request.isRequested(SHOW_SELECT, true);
- if (showSelector) {
- request.appendHtml("<form action=\"log.app\" type=\"post\" >");
- request.appendHtml("<input type=\"hidden\" name=\"view\" value=\"" + view + "\" />");
- request.appendHtml("<select name=\"level\">");
- for (final org.apache.log4j.Level l : new org.apache.log4j.Level[] { org.apache.log4j.Level.OFF, org.apache.log4j.Level.FATAL, org.apache.log4j.Level.ERROR, org.apache.log4j.Level.WARN, org.apache.log4j.Level.INFO, org.apache.log4j.Level.DEBUG, org.apache.log4j.Level.TRACE }) {
- final String settings = level + "\"" + (level == l ? " selected=\"selected\" " : "");
- request.appendHtml("<option " + settings + ">" + l + "</option>");
- }
- request.appendHtml("<input type=\"submit\" value=\"Change Level\" />");
- request.appendHtml("</select>");
- request.appendHtml("</form>");
- } else {
- request.appendHtml(level.toString());
- }
- }
-
- @Override
- public String getName() {
- return "log-level";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
deleted file mode 100644
index 54ff196..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import java.util.List;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Members extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- public String getName() {
- return "members";
- }
-
- @Override
- public void process(final Request request) {
- if (request.getContext().isDebugDisabled()) {
- return;
- }
-
- final String id = request.getOptionalProperty(OBJECT);
- final String fieldName = request.getOptionalProperty(FIELD);
- request.appendHtml("<pre class=\"debug\">");
- try {
- ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
- ObjectAssociation field = null;
- if (fieldName != null) {
- field = object.getSpecification().getAssociation(fieldName);
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
- object = field.get(object);
- }
- request.processUtilCloseTag();
-
- final ObjectSpecification specification = field == null ? object.getSpecification() : field.getSpecification();
-
- request.appendHtml(specification.getSingularName() + " (" + specification.getFullIdentifier() + ") \n");
- final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED);
- for (final ObjectAssociation fld : fields) {
- if (!fld.isAlwaysHidden()) {
- request.appendHtml(" " + fld.getId() + " - '" + fld.getName() + "' -> " + fld.getSpecification().getSingularName() + (fld.isOneToManyAssociation() ? " (collection of)" : "") + "\n");
- }
- }
- request.appendHtml(" --------------\n");
- final List<ObjectAction> actions = specification.getObjectActions(
- ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
- ;
- for (final ObjectAction action : actions) {
- request.appendHtml(" " + action.getId() + " (");
- boolean first = true;
- for (final ObjectActionParameter parameter : action.getParameters()) {
- if (!first) {
- request.appendHtml(", ");
- }
- request.appendHtml(parameter.getSpecification().getSingularName());
- first = false;
- }
- request.appendHtml(")" + " - '" + action.getName() + "'");
- if (action.getSpecification() != null) {
- request.appendHtml(" -> " + action.getSpecification().getSingularName() + ")");
- }
- request.appendHtml("\n");
- }
- } catch (final ScimpiException e) {
- request.appendHtml("Debug failed: " + e.getMessage());
- }
- request.appendHtml("</pre>");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ShowDebug.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ShowDebug.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ShowDebug.java
deleted file mode 100644
index 895f9a6..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ShowDebug.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class ShowDebug extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- if (request.getContext().isDebugDisabled()) {
- request.skipUntilClose();
- } else {
- request.processUtilCloseTag();
- }
- }
-
- @Override
- public String getName() {
- return "show-debug";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Specification.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Specification.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Specification.java
deleted file mode 100644
index 0974fe4..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Specification.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.isis.core.commons.lang.StringExtensions;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-
-public class Specification extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final RequestContext context = request.getContext();
- if (context.isDebugDisabled()) {
- return;
- }
-
- if (request.isRequested("always") || context.getDebug() == RequestContext.Debug.ON) {
- request.appendHtml("<div class=\"debug\">");
- request.appendHtml("<pre>");
-
- final String id = request.getOptionalProperty("object");
- final ObjectAdapter object = context.getMappedObjectOrResult(id);
- final ObjectSpecification specification = object.getSpecification();
- String type = request.getOptionalProperty(TYPE, "details");
-
- if (type.equals("graph")) {
- specificationGraph(request, specification, null, new ArrayList<ObjectSpecification>(), 0);
- } else if (type.equals("details")) {
- specificationDetails(request, specification);
- } else {
- request.appendHtml("invalid type: " + type);
- }
-
- request.appendHtml("</pre>");
- request.appendHtml("</div>");
- }
- }
-
- private void specificationDetails(final Request request, final ObjectSpecification specification) {
- renderName(request, specification);
- final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED);
- for (int i = 0; i < fields.size(); i++) {
- request.appendHtml(" " + fields.get(i).getName() + " (" + fields.get(i).getSpecification().getSingularName()
- + ") \n");
- }
- }
-
- private void specificationGraph(
- Request request,
- ObjectSpecification specification,
- String fieldName,
- List<ObjectSpecification> processed,
- int level) {
- if (processed.contains(specification)) {
- return;
- }
-
- request.appendHtml(StringExtensions.repeat(" ", level));
- if (processed.contains(specification)) {
- request.appendHtml("* ");
- }
- request.appendHtml(specification.getFullIdentifier());
- if (fieldName != null) {
- request.appendHtml(" (" + fieldName + ")");
- }
- request.appendHtml("\n");
-
- if (processed.contains(specification)) {
- return;
- }
- processed.add(specification);
-
- final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED);
- for (int i = 0; i < fields.size(); i++) {
- ObjectSpecification fieldSpecification = fields.get(i).getSpecification();
- if (fieldSpecification.isValue()) {
- continue;
- }
- specificationGraph(request, fieldSpecification, fields.get(i).getName(), processed, level + 1);
- }
- }
-
- private void renderName(final Request request, final ObjectSpecification specification) {
- request.appendHtml(specification.getSingularName() + " (" + specification.getFullIdentifier() + ") \n");
- }
-
- @Override
- public String getName() {
- return "specification";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ThrowException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ThrowException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ThrowException.java
deleted file mode 100644
index 65af85e..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ThrowException.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
-
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class ThrowException extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- if (request.getContext().isDebugDisabled()) {
- return;
- }
-
- final String message = request.getOptionalProperty("message", "Exception throw for testing purposes");
- throw new IsisException(message);
- }
-
- @Override
- public String getName() {
- return "debug-exception";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
deleted file mode 100644
index e88f89a..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.util.List;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedFieldsBlock;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
-
-public abstract class AbstractFormView extends AbstractObjectProcessor {
-
- @Override
- public String checkFieldType(final ObjectAssociation objectField) {
- return objectField.isOneToOneAssociation() ? null : "is not an object";
- }
-
- @Override
- public void process(final Request request, final ObjectAdapter object) {
- final LinkedFieldsBlock tag = new LinkedFieldsBlock();
-
- if (object != null) {
- final String id = request.getOptionalProperty(ID, object.getSpecification().getShortIdentifier());
- final String cls = request.getOptionalProperty(CLASS, "form");
- final String classString = " id=\"" + id + "\" class=\"" + cls + "\"";
- String title = request.getOptionalProperty(FORM_TITLE);
- final String oddRowClass = request.getOptionalProperty(ODD_ROW_CLASS);
- final String evenRowClass = request.getOptionalProperty(EVEN_ROW_CLASS);
- final String labelDelimiter = request.getOptionalProperty(LABEL_DELIMITER, ":");
- final boolean showIcons = request.isRequested(SHOW_ICON, showIconByDefault());
- String linkAllView = request.getOptionalProperty(LINK_VIEW);
-
- request.setBlockContent(tag);
- request.processUtilCloseTag();
-
- final AuthenticationSession session = IsisContext.getAuthenticationSession();
- List<ObjectAssociation> associations = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, object, Where.OBJECT_FORMS));
- final List<ObjectAssociation> fields = tag.includedFields(associations);
- final LinkedObject[] linkFields = tag.linkedFields(fields);
-
- if (linkAllView != null) {
- linkAllView = request.getContext().fullUriPath(linkAllView);
- for (int i = 0; i < linkFields.length; i++) {
- final boolean isObject = fields.get(i).isOneToOneAssociation();
- final boolean isNotParseable = !fields.get(i).getSpecification().containsFacet(ParseableFacet.class);
- linkFields[i] = isObject && isNotParseable ? new LinkedObject(linkAllView) : null;
- }
- }
-
- if (title == null) {
- title = object.getSpecification().getSingularName();
- } else if (title.equals("")) {
- title = null;
- }
-
- write(request, object, fields, linkFields, classString, title, labelDelimiter, oddRowClass, evenRowClass, showIcons);
- } else {
- request.skipUntilClose();
- }
- }
-
- private void write(
- final Request request,
- final ObjectAdapter object,
- final List<ObjectAssociation> fields,
- final LinkedObject[] linkFields,
- final String classString,
- final String title,
- final String labelDelimiter,
- final String oddRowClass,
- final String evenRowClass,
- final boolean showIcons) {
- request.appendHtml("<div" + classString + ">");
- if (title != null) {
- request.appendHtml("<div class=\"title\">");
- request.appendAsHtmlEncoded(title);
- request.appendHtml("</div>");
- HelpLink.append(request, object.getSpecification().getDescription(), object.getSpecification().getHelp());
- }
- int row = 1;
- for (int i = 0; i < fields.size(); i++) {
- final ObjectAssociation field = fields.get(i);
- if (ignoreField(field)) {
- continue;
- }
- if (field.isVisible(IsisContext.getAuthenticationSession(), object, Where.OBJECT_FORMS).isVetoed()) {
- continue;
- }
-
- final String description = field.getDescription().equals("") ? "" : "title=\"" + field.getDescription() + "\"";
- String cls;
- if (row++ % 2 == 1) {
- cls = " class=\"field " + (oddRowClass == null ? ODD_ROW_CLASS : oddRowClass) + "\"";
- } else {
- cls = " class=\"field " + (evenRowClass == null ? EVEN_ROW_CLASS : evenRowClass) + "\"";
- }
- request.appendHtml("<div " + cls + description + "><span class=\"label\">");
- request.appendAsHtmlEncoded(field.getName());
- request.appendHtml(labelDelimiter + "</span>");
- final LinkedObject linkedObject = linkFields[i];
- addField(request, object, field, linkedObject, showIcons);
- HelpLink.append(request, field.getDescription(), field.getHelp());
- request.appendHtml("</div>");
- }
- request.appendHtml("</div>");
- }
-
- protected void addField(final Request request, final ObjectAdapter object, final ObjectAssociation field, final LinkedObject linkedObject, final boolean showIcons) {
- FieldValue.write(request, object, field, linkedObject, null, showIcons, 0);
- }
-
- protected boolean ignoreField(final ObjectAssociation objectField) {
- return false;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
deleted file mode 100644
index 286d84d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import java.util.Iterator;
-import java.util.List;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public abstract class AbstractTableView extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ALL_TABLES) or @Disabled(where=Where.ALL_TABLES) will indeed
- // be hidden from all tables but will be visible/enabled (perhaps incorrectly)
- // if annotated with Where.PARENTED_TABLE or Where.STANDALONE_TABLE
- private final Where where = Where.ALL_TABLES;
-
- @Override
- public void process(final Request request) {
- final RequestContext context = request.getContext();
-
- ObjectAdapter collection;
- String parentObjectId = null;
- boolean isFieldEditable = false;
- final String field = request.getOptionalProperty(FIELD);
- final String tableClass = request.getOptionalProperty(CLASS);
- ObjectSpecification elementSpec;
- String tableId;
- if (field != null) {
- final String objectId = request.getOptionalProperty(OBJECT);
- final ObjectAdapter object = context.getMappedObjectOrResult(objectId);
- if (object == null) {
- throw new ScimpiException("No object for result or " + objectId);
- }
- final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
- if (!objectField.isOneToManyAssociation()) {
- throw new ScimpiException("Field " + objectField.getId() + " is not a collection");
- }
- isFieldEditable = objectField.isUsable(IsisContext.getAuthenticationSession(), object, where).isAllowed();
- ResolveFieldUtil.resolveField(object, objectField);
- collection = objectField.get(object);
- final TypeOfFacet facet = objectField.getFacet(TypeOfFacet.class);
- elementSpec = facet.valueSpec();
- parentObjectId = objectId == null ? context.mapObject(object, Scope.REQUEST) : objectId;
- tableId = request.getOptionalProperty(ID, field);
- } else {
- final String id = request.getOptionalProperty(COLLECTION);
- collection = context.getMappedObjectOrResult(id);
- elementSpec = collection.getElementSpecification();
- tableId = request.getOptionalProperty(ID, collection.getElementSpecification().getShortIdentifier());
- }
-
- final String summary = request.getOptionalProperty("summary");
- final String rowClassesList = request.getOptionalProperty(ROW_CLASSES, ODD_ROW_CLASS + "|" + EVEN_ROW_CLASS);
- String[] rowClasses = null;
- if (rowClassesList.length() > 0) {
- rowClasses = rowClassesList.split("[,|/]");
- }
-
- final List<ObjectAssociation> allFields = elementSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);
- final TableContentWriter rowBuilder = createRowBuilder(request, context, isFieldEditable ? parentObjectId : null, allFields, collection);
- write(request, collection, summary, rowBuilder, tableId, tableClass, rowClasses);
-
- }
-
- protected PersistenceSession getPersistenceSession() {
- return IsisContext.getPersistenceSession();
- }
-
- protected abstract TableContentWriter createRowBuilder(final Request request, RequestContext context, final String parent, final List<ObjectAssociation> allFields, ObjectAdapter collection);
-
- public static void write(
- final Request request,
- final ObjectAdapter collection,
- final String summary,
- final TableContentWriter rowBuilder,
- final String tableId,
- final String tableClass,
- final String[] rowClasses) {
- final RequestContext context = request.getContext();
-
- final String summarySegment = summary == null ? "" : (" summary=\"" + summary + "\"");
- final String idSegment = tableId == null ? "" : (" id=\"" + tableId + "\"");
- final String classSegment = tableClass == null ? "" : (" class=\"" + tableClass + "\"");
- request.appendHtml("<table" + idSegment + classSegment + summarySegment + ">");
- rowBuilder.writeCaption(request);
- rowBuilder.writeHeaders(request);
- rowBuilder.writeFooters(request);
-
- request.appendHtml("<tbody>");
- final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
- final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
- int row = 1;
- while (iterator.hasNext()) {
- final ObjectAdapter element = iterator.next();
-
- context.addVariable("row", "" + (row), Scope.REQUEST);
- String cls = "";
- if (rowClasses != null) {
- cls = " class=\"" + rowClasses[row % rowClasses.length] + "\"";
- }
- request.appendHtml("<tr" + cls + ">");
- rowBuilder.writeElement(request, context, element);
- request.appendHtml("</tr>");
- row++;
- }
- request.appendHtml("</tbody>");
- request.appendHtml("</table>");
-
- rowBuilder.tidyUp();
- }
-
- @Override
- public String getName() {
- return "table";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddMessage.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddMessage.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddMessage.java
deleted file mode 100644
index 7076f70..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddMessage.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class AddMessage extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String content = request.popBuffer();
-
- final MessageBroker messageBroker = IsisContext.getMessageBroker();
- messageBroker.addMessage(content);
- }
-
- @Override
- public String getName() {
- return "add-message";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddWarning.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddWarning.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddWarning.java
deleted file mode 100644
index ac0d240..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddWarning.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.display;
-
-import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class AddWarning extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String content = request.popBuffer();
-
- final MessageBroker messageBroker = IsisContext.getMessageBroker();
- messageBroker.addWarning(content);
- }
-
- @Override
- public String getName() {
- return "add-warning";
- }
-
-}
[20/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
deleted file mode 100644
index 183a0b2..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
+++ /dev/null
@@ -1,857 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.context;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.Serializable;
-import java.util.*;
-import java.util.Map.Entry;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringEscapeUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.factory.InstanceUtil;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.oid.AggregatedOid;
-import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
-import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.ErrorCollator;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.action.PropertyException;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsers;
-
-public abstract class RequestContext {
- private static final Logger LOG = LoggerFactory.getLogger(RequestContext.class);
- static final String TRANSIENT_OBJECT_OID_MARKER = "~";
-
- public enum Scope {
- GLOBAL, SESSION, INTERACTION, REQUEST, ERROR
- };
-
- public enum Debug {
- ON, OFF, PAGE
- }
-
- public static Scope scope(final String scopeName) {
- final String name = scopeName.toUpperCase();
- if (name.equals(Scope.GLOBAL.toString())) {
- return Scope.GLOBAL;
- } else if (name.equals(Scope.SESSION.toString())) {
- return Scope.SESSION;
- } else if (name.equals(Scope.INTERACTION.toString())) {
- return Scope.INTERACTION;
- } else if (name.equals(Scope.REQUEST.toString())) {
- return Scope.REQUEST;
- }
- throw new IllegalArgumentException("Invalid scope name: " + scopeName);
- }
-
- public static Scope scope(final String scopeName, final Scope defaultScope) {
- if (scopeName == null || scopeName.trim().equals("")) {
- return defaultScope;
- } else {
- return scope(scopeName);
- }
- }
-
- public static final String RESULT = "_result";
- public static final String ERROR = "_error";
- public static final String BACK_TO = "_back_to";
- private static final Map<String, Object> globalVariables = new HashMap<String, Object>();
- private static final Scope[] SCOPES = new Scope[] { Scope.ERROR, Scope.REQUEST, Scope.INTERACTION, Scope.SESSION, Scope.GLOBAL };
-
- private final OidMarshaller oidMarshaller = new OidMarshaller();
-
-
- private final ObjectMapping objectMapping;
- private final VersionMapping versionMapping;
- private final Map<Scope, Map<String, Object>> variables;
- private final StringBuffer debugTrace = new StringBuffer();
- private final DebugUsers debugUsers;
-
- private String forwardTo;
- private String requestedFile;
- private String requestedParentPath;
- private AuthenticationSession session;
- private Debug debug;
- private String resourceFile;
- private String resourceParentPath;
- private ObjectAdapter collection;
- private boolean isUserAuthenticated;
-
- public RequestContext(final DebugUsers debugUsers) {
- this.debugUsers = debugUsers;
-
- String className = IsisContext.getConfiguration().getString("scimpi.object-mapping.class", DefaultOidObjectMapping.class.getName());
- objectMapping = InstanceUtil.createInstance(className, ObjectMapping.class);
- className = IsisContext.getConfiguration().getString("scimpi.version-mapping.class", DefaultVersionMapping.class.getName());
- versionMapping = InstanceUtil.createInstance(className, VersionMapping.class);
- variables = new HashMap<Scope, Map<String, Object>>();
-
- variables.put(Scope.GLOBAL, globalVariables);
- variables.put(Scope.SESSION, Maps.<String, Object>newHashMap());
- variables.put(Scope.INTERACTION, Maps.<String, Object>newHashMap());
- variables.put(Scope.REQUEST, Maps.<String, Object>newHashMap());
- variables.put(Scope.ERROR, Maps.<String, Object>newHashMap());
- }
-
- public void endHttpSession() {
- objectMapping.endSession();
- variables.get(Scope.SESSION).clear();
- session = null;
- clearSession();
- }
-
- // //////////////////////////////////////////////////////////////////
- // Mapped objects
- // //////////////////////////////////////////////////////////////////
-
- public ObjectAdapter getMappedObject(final String oidStr) {
- if (oidStr == null || oidStr.trim().equals("") || oidStr.trim().equals("null")) {
- return null;
- }
- if (oidStr.equals("collection")) {
- return collection;
- }
- final ObjectAdapter adapter = mappedObject(oidStr);
- if (adapter == null) {
- throw new ScimpiException("No object for " + oidStr);
- }
- return adapter;
- }
-
- public ObjectAdapter getMappedObjectOrResult(final String id) {
- return getMappedObjectOrVariable(id, RESULT);
- }
-
- public ObjectAdapter getMappedObjectOrVariable(String idOrData, final String name) {
- if (idOrData == null) {
- idOrData = (String) getVariable(name);
- if (idOrData == null) {
- throw new ScimpiException("No variable for " + name);
- }
- }
- if (idOrData.equals("collection")) {
- return collection;
- }
- return getMappedObject(idOrData);
- }
-
- public String mapObject(final ObjectAdapter object, final String scopeName, final Scope defaultScope) {
- final Scope scope = scopeName == null ? defaultScope : scope(scopeName);
- LOG.debug("mapping " + object + " " + scope);
- return objectMapping.mapObject(object, scope);
- }
-
- private ObjectAdapter mappedObject(String dataOrOid) {
- if (dataOrOid != null && dataOrOid.equals("")) {
- return null;
- }
- if (dataOrOid == null) {
- dataOrOid = RESULT;
- }
-
- if (dataOrOid.startsWith(TRANSIENT_OBJECT_OID_MARKER + "{")) {
- return objectMapping.mappedTransientObject(StringEscapeUtils.unescapeHtml(dataOrOid.substring(TRANSIENT_OBJECT_OID_MARKER.length())));
- }
-
- final String oidStr = dataOrOid;
- final TypedOid typedOid = getOidMarshaller().unmarshal(oidStr, TypedOid.class);
- if(typedOid instanceof RootOid) {
-// final String[] idParts = dataOrOid.split("@");
-// if (idParts.length == 2) {
- final ObjectAdapter mappedObject = objectMapping.mappedObject(oidStr);
- if (mappedObject != null) {
- getPersistenceSession().resolveImmediately(mappedObject);
- }
- return mappedObject;
- }
-
- //
- // else, handle aggregate
- //
- AggregatedOid aggregatedOid = (AggregatedOid) typedOid;
- final TypedOid parentOid = aggregatedOid.getParentOid();
-
- //final ObjectAdapter parentAdapter = objectMapping.mappedObject(idParts[0] + "@" + idParts[1]);
- final ObjectAdapter parentAdapter = objectMapping.mappedObject(parentOid.enString(getOidMarshaller()));
- getPersistenceSession().resolveImmediately(parentAdapter);
-
- //ObjectSpecId objectType = null;
- //final AggregatedOid aggregatedOid = new AggregatedOid(objectType, (TypedOid) parentAdapter.getOid(), idParts[2]);
-
- ObjectAdapter aggregatedAdapter = null;
- outer: for (final ObjectAssociation association : parentAdapter.getSpecification().getAssociations(Contributed.EXCLUDED)) {
- if (association.getSpecification().isParented()) {
- final ObjectAdapter objectAdapter = association.get(parentAdapter);
- if (objectAdapter == null) {
- continue;
- }
- if (association.isOneToManyAssociation()) {
- final ObjectAdapter coll = objectAdapter;
- final CollectionFacet facet = coll.getSpecification().getFacet(CollectionFacet.class);
- for (final ObjectAdapter element : facet.iterable(coll)) {
- if (element.getOid().equals(aggregatedOid)) {
- aggregatedAdapter = element;
- break outer;
- }
- }
- } else {
- if (objectAdapter.getOid().equals(aggregatedOid)) {
- aggregatedAdapter = objectAdapter;
- break;
- }
- }
- } else if (association.isOneToManyAssociation()) {
- if (association.getId().equals(aggregatedOid.getLocalId())) {
- //if (association.getId().equals(idParts[2])) {
- return association.get(parentAdapter);
- }
- }
- }
- return aggregatedAdapter;
- }
-
-
- public boolean isInternalRequest() {
- final String referrer = getHeader("Referer"); // Note spelling mistake
- // is intentional
- return referrer != null && referrer.contains("localhost"); // TODO need
- // to look
- // for actual
- // domain
- }
-
- // //////////////////////////////////////////////////////////////////
- // Version
- // //////////////////////////////////////////////////////////////////
-
- public String mapVersion(final ObjectAdapter object) {
- final Version version = object.getVersion();
- return version == null ? "" : versionMapping.mapVersion(version);
- }
-
- public Version getVersion(final String id) {
- if (id.equals("")) {
- return null;
- }
- return versionMapping.getVersion(id);
- }
-
- // ////////////////////////////
- // Debug
- // ////////////////////////////
- public void append(final DebugBuilder debug) {
- debug.startSection("Scimpi Request");
-
- debug.appendTitle("User");
- final AuthenticationSession session = getSession();
- debug.appendln("Authentication Session", session);
- if (session != null) {
- debug.appendln("Name", session.getUserName());
- debug.appendln("Roles", session.getRoles());
- }
-
- debug.appendTitle("context");
- debug.appendln("Parent request path", requestedParentPath);
- debug.appendln("Requested file", requestedFile);
- debug.appendln("Parent resource path", resourceParentPath);
- debug.appendln("Resource file", resourceFile);
- debug.endSection();
-
- debug.startSection("Variables");
- append(debug, Scope.GLOBAL);
- append(debug, Scope.SESSION);
- append(debug, Scope.INTERACTION);
- append(debug, Scope.REQUEST);
- append(debug, Scope.ERROR);
- debug.endSection();
-
- debug.startSection("Object Mapping");
- objectMapping.append(debug);
- debug.endSection();
- }
-
- private void append(final DebugBuilder view, final Scope scope) {
- final Map<String, Object> map = variables.get(scope);
- final Iterator<String> keys = new TreeSet<String>(map.keySet()).iterator();
- if (keys.hasNext()) {
- view.appendTitle(scope + " scoped variables");
- while (keys.hasNext()) {
- final String key = keys.next();
- final Object object = map.get(key);
- final String mappedTo = "";
- view.appendln(key, object + mappedTo);
- }
- }
- }
-
- public void append(final DebugBuilder debug, final String list) {
- if (list.equals("variables")) {
- appendVariables(debug, Scope.GLOBAL);
- appendVariables(debug, Scope.SESSION);
- appendVariables(debug, Scope.INTERACTION);
- appendVariables(debug, Scope.REQUEST);
- appendVariables(debug, Scope.ERROR);
- } else if (list.equals("mappings")) {
- objectMapping.appendMappings(debug);
- }
- }
-
- private void appendVariables(final DebugBuilder debug, final Scope scope) {
- final Map<String, Object> map = variables.get(scope);
- final Iterator<String> names = new TreeSet(map.keySet()).iterator();
- if (names.hasNext()) {
- debug.startSection(scope.toString());
- while (names.hasNext()) {
- final String name = names.next();
- try {
- final Object object = map.get(name);
- String details = "";
- if (object instanceof String) {
- final ObjectAdapter mappedObject = mappedObject((String) object);
- if (mappedObject != null) {
- details = mappedObject.toString();
- }
- }
- debug.appendln(name, object + " " + details);
- } catch (final Exception e) {
- debug.appendln(name, map.get(name));
- }
- }
- debug.endSection();
- }
- }
-
- public List<String> getDebugUsers() {
- return debugUsers.getNames();
- }
-
- // ////////////////////////////
- // Variables
- // ////////////////////////////
-
- public void clearVariables(final Scope scope) {
- variables.get(scope).clear();
- }
-
- public void changeScope(final String name, final Scope newScope) {
- for (final Scope element : SCOPES) {
- final Map<String, Object> map = variables.get(element);
- final Object object = map.get(name);
- if (object != null) {
- map.remove(name);
- addVariable(name, object, newScope);
- return;
- }
- }
- }
-
- public void clearVariable(String name, final Scope scope) {
- name = name != null ? name : RESULT;
- variables.get(scope).remove(name);
- }
-
- public void addVariable(final String name, final Object value, final String scope) {
- addVariable(name, value, scope(scope));
- }
-
- public void addVariable(String name, final Object value, final Scope scope) {
- name = name != null ? name : RESULT;
- if (scope == Scope.SESSION && value != null && !(value instanceof Serializable)) {
- throw new ScimpiException("SESSION scoped variable (" + name + ") must be serializable: " + value);
- }
- removeExistingVariable(name);
- variables.get(scope).put(name, value);
- }
-
- private void removeExistingVariable(final String name) {
- for (final Scope element : SCOPES) {
- final Map<String, Object> map = variables.get(element);
- final Object object = map.get(name);
- if (object != null) {
- map.remove(name);
- break;
- }
- }
- }
-
- public String getStringVariable(final String name) {
- final String value = (String) getVariable(name);
- if (value == null) {
- return null;
- } else {
- return replaceVariables(value);
- }
- }
-
- public Object getVariable(final String name) {
- for (final Scope element : SCOPES) {
- final Map<String, Object> map = variables.get(element);
- final Object object = map.get(name);
- if (object != null) {
- return object;
- }
- }
- return null;
- }
-
- public String replaceVariables(String value) {
- final int start = value.indexOf("${");
- if (start == -1) {
- return value;
- } else {
- final int end = value.indexOf('}');
- if (end == -1) {
- throw new PropertyException("No closing brace in " + value.substring(start));
- } else if (end < start) {
- throw new PropertyException("Closing brace before opening brace in " + value.substring(end));
- }
- final String name = value.substring(start + 2, end);
- if (name != null) {
- final int pos = name.indexOf(":");
- final String variableName = pos == -1 ? name : name.substring(0, pos);
- final String qualifier = pos == -1 ? "none" : name.substring(pos);
- Object replacementValue;
- final boolean embed = qualifier.indexOf("embed") > -1;
- if (embed) {
- replacementValue = "${" + variableName + "}";
- } else {
- replacementValue = getParameter(variableName);
- if (replacementValue == null) {
- replacementValue = getVariable(variableName);
- }
- if (replacementValue == null) {
- replacementValue = getBuiltIn(variableName);
- }
-
- if (replacementValue == null) {
- final boolean ensureExists = qualifier.indexOf("optional") == -1;
- if (ensureExists) {
- throw new PropertyException("No value for the variable " + value.substring(start, end + 1));
- } else {
- replacementValue = "";
- }
- }
- }
- final boolean repeat = qualifier.indexOf("repeat") > -1;
- if (repeat) {
- value = value.substring(0, start) + replacementValue + value.substring(end + 1);
- return replaceVariables(value);
- } else {
- final String remainder = replaceVariables(value.substring(end + 1));
- value = value.substring(0, start) + replacementValue + remainder;
- return value;
- }
-
- } else {
- throw new PropertyException("No variable name speceified");
- }
- }
- }
-
- private Object getBuiltIn(final String name) {
- if (name.equals("_session")) {
- return getSessionId();
- } else if (name.equals("_context")) {
- return getContextPath();
- } else if (name.equals("_this")) {
- return resourceFile;
- } else if (name.equals("_directory")) {
- return resourceParentPath;
- } else if (name.equals("_base")) {
- return getUrlBase() + getContextPath() + resourceParentPath + resourceFile;
- // return "http://localhost:8080" + resourceParentPath +
- // resourceFile;
- }
- return null;
- }
-
- public String encodedInteractionParameters() {
- final StringBuffer buffer = new StringBuffer();
- final Map<String, Object> map = variables.get(Scope.INTERACTION);
- final Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
- while (iterator.hasNext()) {
- final Entry<String, Object> entry = iterator.next();
- buffer.append("&" + entry.getKey() + "=" + entry.getValue());
- }
- return buffer.toString();
- }
-
- public String interactionFields() {
- final StringBuffer buffer = new StringBuffer();
- final Map<String, Object> map = variables.get(Scope.INTERACTION);
- final Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
- while (iterator.hasNext()) {
- final Entry<String, Object> entry = iterator.next();
- buffer.append("<input type=\"hidden\" name=\"" + entry.getKey() + "\" value=\"" + entry.getValue() + "\" />\n");
- }
- return buffer.toString();
- }
-
- protected abstract String getSessionId();
-
- public abstract void addCookie(String name, String value, int minutesUtilExpires);
-
- public abstract String getCookie(String name);
-
-
-
- // /////////////////////////////////////////////////
- // Start/end request
- // /////////////////////////////////////////////////
-
- public void endRequest() throws IOException {
- getWriter().close();
- objectMapping.clear();
- variables.get(Scope.ERROR).clear();
- variables.get(Scope.REQUEST).clear();
- variables.get(Scope.INTERACTION).clear();
- }
-
- public void startRequest() {
- debugTrace.setLength(0);
- objectMapping.reloadIdentityMap();
- final String debugParameter = getParameter("debug");
- if (debugParameter != null) {
- if (debugParameter.equals("off")) {
- debug = Debug.OFF;
- } else if (debugParameter.equals("on")) {
- debug = Debug.ON;
- } else if (debugParameter.equals("page")) {
- debug = Debug.PAGE;
- }
- }
- }
-
- public abstract PrintWriter getWriter();
-
- // /////////////////////////////
- // Forwarding
- // /////////////////////////////
- public void forwardTo(final String forwardTo) {
- this.forwardTo = "/" + forwardTo;
- }
-
- public String forwardTo() {
- final String returnForwardTo = forwardTo;
- forwardTo = null;
- return returnForwardTo;
- }
-
- // /////////////////////////////
- // Parameters
- // /////////////////////////////
- public void addParameter(final String name, final String parameter) {
- if (name == null) {
- throw new ScimpiException("Name must be specified for parameter " + parameter);
- }
- addVariable(name, parameter, Scope.REQUEST);
- }
-
- public String getParameter(final String name) {
- final Object variable = getVariable(name);
- if (variable instanceof String || variable == null) {
- return (String) variable;
- } else {
- return variable.toString();
- }
- }
-
- public Iterator<Entry<String, Object>> interactionParameters() {
- final Map<String, Object> map = variables.get(Scope.REQUEST);
- final Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
- return iterator;
- }
-
- // ///////////////////////////////////////
- // Requested file
- // ///////////////////////////////////////
-
- /**
- * The requested file is the file that the browser requested. This may or
- * may not be the file that is actually processed and returned; that is the
- * {@link #getResourceFile()}.
- */
- public String getRequestedFile() {
- return requestedFile;
- }
-
- public void setRequestPath(final String filePath) {
- setRequestPath(filePath, null);
- }
-
- public void setRequestPath(final String filePath, String defaultGenericPath) {
- if (filePath == null) {
- defaultGenericPath = defaultGenericPath == null ? "" : defaultGenericPath;
- this.requestedFile = Dispatcher.GENERIC + defaultGenericPath + "." + Dispatcher.EXTENSION;
- } else if (filePath.startsWith("_generic")) {
- this.requestedParentPath = "/";
- LOG.debug("generic file, requested path cleared");
- this.requestedFile = filePath;
- LOG.debug("requested file set = " + filePath);
-
- } else {
- final int lastSlash = filePath.lastIndexOf('/');
- if (lastSlash == -1) {
- throw new ScimpiException("No slash in request path: " + filePath);
- }
- final String path = filePath.substring(0, lastSlash + 1);
- LOG.debug("requested path set = " + path);
- this.requestedParentPath = path;
-
- final String file = filePath.substring(lastSlash + 1);
- LOG.debug("requested file set = " + file);
- this.requestedFile = file;
- }
- }
-
- public void clearRequestedPath() {
- this.requestedParentPath = null;
- this.requestedFile = null;
- }
-
- /**
- * Returns the absolute file system path to the specified resource based on
- * the path used for the current request during the call to
- * {@link #setRequestPath(String)}. The return path can then be used to
- * access the specified resource. If the resource has a leading slash (/)
- * then that resource string is returned as the path.
- */
- public String requestedFilePath(final String resource) {
- if (resource.startsWith("/")) {
- return resource;
- } else {
- return requestedParentPath + resource;
- }
- }
-
- // ///////////////////////////////////////
- // Resource file
- // ///////////////////////////////////////
-
- /**
- * The resource file is the file on disk that is processed and returned to
- * the browser. This may or may not be the file that was actually requested
- * by the browser; that is the {@link #getRequestedFile()}.
- */
- public String getResourceFile() {
- return resourceFile;
- }
-
- public String getResourceParentPath() {
- return resourceParentPath;
- }
-
- public void setResourcePath(final String filePath) {
- if (filePath == null) {
- throw new ScimpiException("Path must be specified");
- } else {
- final int lastSlash = filePath.lastIndexOf('/');
- if (lastSlash == -1) {
- throw new ScimpiException("No slash in request path: " + filePath);
- }
- final String path = /* getContextPath() + */filePath.substring(0, lastSlash + 1);
- LOG.debug("resource path set = " + path);
- this.resourceParentPath = path;
-
- final String file = filePath.substring(lastSlash + 1);
- LOG.debug("resource file set = " + file);
- this.resourceFile = file;
- }
- }
-
- /**
- * Returns a uri for the specified resource based on the path used for the
- * current request (as set up during the call to
- * {@link #setResourcePath(String)}). Such a uri when used by the browser
- * will allow access to the specified resource. If the resource has a
- * leading slash (/) or the resource is for a generic page (starts with
- * "_generic") then that resource string is returned as the path.
- */
- public String fullUriPath(final String resource) {
- if (resource.startsWith("/") || resource.startsWith("_generic")) {
- return resource;
- } else {
- return getContextPath() + resourceParentPath + resource;
- }
- }
-
- /**
- * Returns the absolute file system path to the specified resource based on
- * the path used for the current request (as set up during the call to
- * {@link #setResourcePath(String)}). The return path can then be used to
- * access the specified resource. If the resource has a leading slash (/) or
- * the resource is for a generic page (starts with "_generic") then that
- * resource string is returned as the path.
- */
- public String fullFilePath(final String resource) {
- if (resource.startsWith("/") || resource.startsWith("_generic")) {
- return resource;
- } else {
- return resourceParentPath + resource;
- }
- }
-
- // //////////////////////////////////////////////////////////////////
- //
- // //////////////////////////////////////////////////////////////////
-
- public String mapObject(final ObjectAdapter object, final Scope scope) {
- if (object.isValue()) {
- return object.titleString();
- } else if (scope == Scope.INTERACTION && object.isTransient()) {
- return objectMapping.mapTransientObject(object);
- } else if (object.getOid() != null) {
- return objectMapping.mapObject(object, scope);
- } else {
- collection = object;
- return "collection";
- }
- }
-
- public void unmapObject(final ObjectAdapter object, final Scope scope) {
- objectMapping.unmapObject(object, scope);
- }
-
- public abstract String findFile(String fileName);
-
- public abstract InputStream openStream(String path);
-
- public abstract String imagePath(ObjectAdapter object);
-
- public abstract String imagePath(ObjectSpecification specification);
-
- public abstract void forward(String view);
-
- public abstract void redirectTo(String view);
-
- public abstract String getContextPath();
-
- public abstract String getUrlBase();
-
- public abstract String getHeader(String name);
-
- public abstract String getQueryString();
-
- public abstract void startHttpSession();
-
- public abstract String clearSession();
-
- public abstract boolean isAborted();
-
- public abstract String getErrorReference();
-
- public abstract String getErrorMessage();
-
- public abstract String getErrorDetails();
-
- public void setSession(final AuthenticationSession session) {
- this.session = session;
- addVariable("_auth_session", session, Scope.SESSION);
- }
-
- public AuthenticationSession getSession() {
- return session;
- }
-
- public abstract String getUri();
-
- public void raiseError(final int status, final ErrorCollator errorDetails) {
- }
-
- public void setContentType(final String string) {
- }
-
- public void setSessionData(final Map<String, Object> hashMap) {
- variables.put(Scope.SESSION, hashMap);
- session = (AuthenticationSession) getVariable("_auth_session");
- Boolean authenticated = (Boolean) getVariable("_authenticated");
- isUserAuthenticated = authenticated != null && authenticated.booleanValue();
- }
-
- public Map<String, Object> getSessionData() {
- return variables.get(Scope.SESSION);
- }
-
- public Debug getDebug() {
- return debug;
- }
-
- public boolean isDebugDisabled() {
- return !debugUsers.isDebugEnabled(getSession());
- }
-
- public boolean isDebug() {
- return getDebug() == Debug.ON;
- }
-
- public boolean showDebugData() {
- final Boolean variable = (Boolean) getVariable("debug-on");
- return variable != null && variable.booleanValue();
- }
-
- public String getDebugTrace() {
- return debugTrace.toString().replace('<', '[').replace('>', ']');
- }
-
- public void appendDebugTrace(final String line) {
- debugTrace.append(line);
- }
-
- public void clearTransientVariables() {
- objectMapping.endSession();
- }
-
- public void reset() {
- }
-
- public boolean isUserAuthenticated() {
- return isUserAuthenticated;
- }
-
- public void setUserAuthenticated(boolean isUserAuthenticated) {
- this.isUserAuthenticated = isUserAuthenticated;
- addVariable("_authenticated", isUserAuthenticated, Scope.SESSION);
- }
-
-
- protected PersistenceSession getPersistenceSession() {
- return IsisContext.getPersistenceSession();
- }
-
- protected OidMarshaller getOidMarshaller() {
- return oidMarshaller;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/VersionMapping.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/VersionMapping.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/VersionMapping.java
deleted file mode 100644
index 0ce8645..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/VersionMapping.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.context;
-
-import org.apache.isis.core.metamodel.adapter.version.Version;
-
-public interface VersionMapping {
-
- String mapVersion(Version version);
-
- Version getVersion(String id);
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugAction.java
deleted file mode 100644
index 8e5822d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugAction.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.debug;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.commons.debug.DebuggableWithTitle;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.util.Dump;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.Action;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-
-public class DebugAction implements Action {
- private final Dispatcher dispatcher;
-
- public DebugAction(final Dispatcher dispatcher) {
- this.dispatcher = dispatcher;
- }
-
- @Override
- public String getName() {
- return "debug";
- }
-
- @Override
- public void debug(final DebugBuilder debug) {
- }
-
- @Override
- public void process(final RequestContext context) throws IOException {
- if (context.isDebugDisabled()) {
- throw new ForbiddenException("Can't access debug action when debug is disabled");
- }
-
- final String action = context.getParameter("action");
- if ("list-i18n".equals(action)) {
- i18n(context, null);
- } else if ("list-authorization".equals(action)) {
- authorization(context, null);
- } else if (context.getParameter("mode") != null) {
- final boolean isDebugOn = context.getParameter("mode").equals("debug");
- context.addVariable("debug-on", isDebugOn, Scope.SESSION);
- // TODO need to use configuration to find path
- context.setRequestPath("/debug/debug.shtml");
- } else {
-
- // TODO remove - replaced by Debug tag
- final DebugHtmlWriter view = new DebugHtmlWriter(context.getWriter(), true);
- view.appendln("<div class=\"links\">");
- view.appendln("<a href=\"debug.app?action=system\">System</a>");
- view.appendln(" | <a href=\"debug.app?action=specifications\">List specifications</a>");
- view.appendln(" | <a href=\"debug.app?action=list-i18n\">I18N File</a>");
- view.appendln(" | <a href=\"debug.app?action=list-authorization\">Authorization File</a>");
- view.appendln(" | <a href=\"debug.app?action=context\">Context</a>");
- view.appendln(" | <a href=\"debug.app?action=dispatcher\">Dispatcher</a>");
- view.appendln("</div>");
-
- if ("specifications".equals(action)) {
- listSpecifications(view);
- } else if ("specification".equals(action)) {
- // specification(context, view);
- } else if ("object".equals(action)) {
- object(context, view);
- } else if ("system".equals(action)) {
- system(context, view);
- } else if ("context".equals(action)) {
- context.append(view);
- } else if ("dispatcher".equals(action)) {
- dispatcher.debug(view);
- }
-
- context.clearRequestedPath();
- }
- }
-
- private void object(final RequestContext context, final DebugHtmlWriter view) {
- final ObjectAdapter object = context.getMappedObjectOrResult(context.getParameter("object"));
- final DebugString str = new DebugString();
- Dump.adapter(object, str);
- Dump.graph(object, IsisContext.getAuthenticationSession(), str);
- view.appendTitle(object.getSpecification().getFullIdentifier());
- view.appendln("<pre class=\"debug\">" + str + "</pre>");
- }
-
- private void system(final RequestContext context, final DebugHtmlWriter view) {
- final DebuggableWithTitle[] debug = IsisContext.debugSystem();
- view.appendTitle("System");
- for (final DebuggableWithTitle element2 : debug) {
- final DebugString str = new DebugString();
- element2.debugData(str);
- view.appendTitle(element2.debugTitle());
- view.appendln("<pre class=\"debug\">" + str + "</pre>");
- }
- }
-
- private void i18n(final RequestContext context, final DebugHtmlWriter view) {
- final Collection<ObjectSpecification> allSpecifications = getSpecificationLoader().allSpecifications();
- final List<ObjectSpecification> specs = Lists.newArrayList(allSpecifications);
- Collections.sort(specs, new Comparator<ObjectSpecification>() {
- @Override
- public int compare(final ObjectSpecification o1, final ObjectSpecification o2) {
- return o1.getShortIdentifier().compareTo(o2.getShortIdentifier());
- }
- });
- final Function<ObjectSpecification, String> className = ObjectSpecification.FUNCTION_FULLY_QUALIFIED_CLASS_NAME;
- final List<String> fullIdentifierList = Lists.newArrayList(Collections2.transform(specs, className));
- for (final String fullIdentifier : fullIdentifierList) {
- final ObjectSpecification spec = getSpecificationLoader().loadSpecification(fullIdentifier);
- if (spec.getAssociations(Contributed.EXCLUDED).size() == 0 && spec.getObjectActions(Contributed.EXCLUDED).size() == 0) {
- continue;
- }
- final String name = spec.getIdentifier().toClassIdentityString();
- context.getWriter().append("# " + spec.getShortIdentifier() + "\n");
- for (final ObjectAssociation assoc : spec.getAssociations(Contributed.EXCLUDED)) {
- context.getWriter().append("#" + name + ".property." + assoc.getId() + ".name" + "=\n");
- context.getWriter().append("#" + name + ".property." + assoc.getId() + ".description" + "=\n");
- context.getWriter().append("#" + name + ".property." + assoc.getId() + ".help" + "=\n");
- }
- for (final ObjectAction action : spec.getObjectActions(Contributed.EXCLUDED)) {
- context.getWriter().append("#" + name + ".action." + action.getId() + ".name" + "=\n");
- context.getWriter().append("#" + name + ".action." + action.getId() + ".description" + "=\n");
- context.getWriter().append("#" + name + ".action." + action.getId() + ".help" + "=\n");
- }
- context.getWriter().append("\n");
- }
- }
-
- private void authorization(final RequestContext context, final DebugHtmlWriter view) {
- final Collection<ObjectSpecification> allSpecifications = getSpecificationLoader().allSpecifications();
- final List<ObjectSpecification> specs = Lists.newArrayList(allSpecifications);
- Collections.sort(specs, new Comparator<ObjectSpecification>() {
- @Override
- public int compare(final ObjectSpecification o1, final ObjectSpecification o2) {
- return o1.getShortIdentifier().compareTo(o2.getShortIdentifier());
- }
- });
- final Function<ObjectSpecification, String> className = ObjectSpecification.FUNCTION_FULLY_QUALIFIED_CLASS_NAME;
- final List<String> fullIdentifierList = Lists.newArrayList(Collections2.transform(specs, className));
-
- for (final String fullIdentifier : fullIdentifierList) {
- final ObjectSpecification spec = getSpecificationLoader().loadSpecification(fullIdentifier);
- if (spec.getAssociations(Contributed.EXCLUDED).size() == 0 && spec.getObjectActions(Contributed.EXCLUDED).size() == 0) {
- continue;
- }
- final String name = spec.getIdentifier().toClassIdentityString();
- boolean isAbstract = spec.isAbstract();
- context.getWriter().append("### " + spec.getShortIdentifier() + (isAbstract ? " (abstract)" : "") + " ###\n");
- context.getWriter().append((isAbstract ? "#" : "") + name + ":roles\n\n");
- }
- context.getWriter().append("\n\n");
-
- for (final String fullIdentifier : fullIdentifierList) {
- final ObjectSpecification spec = getSpecificationLoader().loadSpecification(fullIdentifier);
- if (spec.getAssociations(Contributed.EXCLUDED).size() == 0 && spec.getObjectActions(Contributed.EXCLUDED).size() == 0) {
- continue;
- }
- final String name = spec.getIdentifier().toClassIdentityString();
- boolean isAbstract = spec.isAbstract();
- context.getWriter().append("### " + spec.getShortIdentifier() + (isAbstract ? " (abstract)" : "") + " ###\n");
- context.getWriter().append((isAbstract ? "#" : "") + name + ":roles\n");
- for (final ObjectAssociation assoc : spec.getAssociations(Contributed.EXCLUDED)) {
- context.getWriter().append("#" + name + "#" + assoc.getId() + ":roles\n");
- // context.getWriter().append("#" + name + ".property." +
- // assoc.getId() + ".description" + "=\n");
- // context.getWriter().append("#" + name + ".property." +
- // assoc.getId() + ".help" + "=\n");
- }
- for (final ObjectAction action : spec.getObjectActions(Contributed.EXCLUDED)) {
- context.getWriter().append("#" + name + "#" + action.getId() + "():roles\n");
- // context.getWriter().append("#" + name + ".action." +
- // action.getId() + ".description" + "=\n");
- // context.getWriter().append("#" + name + ".action." +
- // action.getId() + ".help" + "=\n");
- }
- context.getWriter().append("\n");
- }
- }
-
- private void listSpecifications(final DebugHtmlWriter view) {
- final List<ObjectSpecification> fullIdentifierList = new ArrayList<ObjectSpecification>(getSpecificationLoader().allSpecifications());
- Collections.sort(fullIdentifierList, ObjectSpecification.COMPARATOR_SHORT_IDENTIFIER_IGNORE_CASE);
- view.appendTitle("Specifications");
- for (final ObjectSpecification spec : fullIdentifierList) {
- final String name = spec.getSingularName();
- view.appendln(name, "");
- // view.appendln(name, specificationLink(spec));
- }
-
- /*
- * new Comparator<ObjectSpecification>() { public int
- * compare(ObjectSpecification o1, ObjectSpecification o2) { return
- * o1.getSingularName().compareTo(o2.getSingularName()); }});
- *
- * /* Collection<ObjectSpecification> allSpecifications =
- * getSpecificationLoader().allSpecifications(); Collection<String> list
- * = Collections2.transform(allSpecifications,
- * ObjectSpecification.COMPARATOR_SHORT_IDENTIFIER_IGNORE_CASE); final
- * List<String> fullIdentifierList = Lists.newArrayList(list); /*
- * Collections.sort(fullIdentifierList, new
- * Comparator<ObjectSpecification>() { public int
- * compare(ObjectSpecification o1, ObjectSpecification o2) { return
- * o1.getSingularName().compareTo(o2.getSingularName()); }});
- */
- /*
- * view.divider("Specifications"); for (String fullIdentifier :
- * fullIdentifierList) { ObjectSpecification spec =
- * getSpecificationLoader().loadSpecification(fullIdentifier); String
- * name = spec.getSingularName(); view.appendRow(name,
- * specificationLink(spec)); }
- */
- }
-
- protected SpecificationLoaderSpi getSpecificationLoader() {
- return IsisContext.getSpecificationLoader();
- }
-
- @Override
- public void init() {
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugHtmlWriter.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugHtmlWriter.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugHtmlWriter.java
deleted file mode 100644
index 112bc77..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugHtmlWriter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.debug;
-
-import java.io.PrintWriter;
-
-import org.apache.isis.core.commons.debug.DebugHtmlStringAbstract;
-
-public class DebugHtmlWriter extends DebugHtmlStringAbstract {
-
- private final PrintWriter writer;
-
- public DebugHtmlWriter(final PrintWriter writer, final boolean createPage) {
- super(createPage);
- this.writer = writer;
- header();
- }
-
- @Override
- protected void appendHtml(final String html) {
- writer.println(html);
- }
-
- @Override
- protected void doClose() {
- footer();
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUserAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUserAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUserAction.java
deleted file mode 100644
index 461ce84..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUserAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.debug;
-
-import java.io.IOException;
-
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.viewer.scimpi.dispatcher.Action;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-
-public class DebugUserAction implements Action {
-
- private final DebugUsers debugUsers;
-
- public DebugUserAction(final DebugUsers debugUsers) {
- this.debugUsers = debugUsers;
- }
-
- @Override
- public String getName() {
- return "debug-user";
- }
-
- @Override
- public void debug(final DebugBuilder debug) {
- }
-
- @Override
- public void process(final RequestContext context) throws IOException {
- if (context.isDebugDisabled()) {
- throw new ForbiddenException("Can't access debug action when debug is disabled");
- }
-
- final String method = context.getParameter(METHOD);
- final String name = context.getParameter(NAME);
- final String view = context.getParameter(VIEW);
-
- if (method != null && method.equals("add")) {
- debugUsers.add(name);
- } else if (method != null && method.equals("remove")) {
- debugUsers.remove(name);
- } else {
- throw new ScimpiException("Invalid debug-user action");
- }
-
- context.setRequestPath(view);
- }
-
- @Override
- public void init() {
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsers.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsers.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsers.java
deleted file mode 100644
index 20497cc..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsers.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.debug;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.config.ConfigurationConstants;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-
-public class DebugUsers {
-
- private static Logger LOG = LoggerFactory.getLogger(DebugUsers.class);
-
- private enum DebugMode {
- OFF, ON, NAMED, SYSADMIN_ONLY
- }
-
- private static List<String> debugUsers = new ArrayList<String>();
- private static DebugMode debugMode;
-
- public void initialize() {
- if (debugMode != null) {
- throw new ScimpiException("Debug mode is already set up!");
- }
-
- final String debugUserEntry = IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.debug.users", "");
- final String[] users = debugUserEntry.split("\\|");
- for (final String name : users) {
- debugUsers.add(name.trim());
- }
-
- final String debugModeEntry = IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.debug.mode");
- if (debugModeEntry != null) {
- try {
- debugMode = DebugMode.valueOf(debugModeEntry.toUpperCase());
- LOG.info("Debug mode set to " + debugMode);
- } catch (final IllegalArgumentException e) {
- LOG.error("Invalid debug mode - " + debugModeEntry + " - mode set to OFF");
- debugMode = DebugMode.OFF;
- }
- } else {
- debugMode = DebugMode.OFF;
- }
- }
-
- public boolean isDebugEnabled(final AuthenticationSession session) {
- if (debugMode == DebugMode.ON) {
- return true;
- } else if (session != null && debugMode == DebugMode.SYSADMIN_ONLY && session.getRoles().contains("sysadmin")) {
- return true;
- } else if (session != null && debugMode == DebugMode.NAMED && (debugUsers.contains(session.getUserName()) || session.getRoles().contains("sysadmin"))) {
- return true;
- }
- return false;
- }
-
- public List<String> getNames() {
- final ArrayList<String> users = new ArrayList<String>(debugUsers);
- Collections.sort(users);
- return users;
- }
-
- public void add(final String name) {
- if (!debugUsers.contains(name)) {
- debugUsers.add(name);
- LOG.info("Added '" + debugMode + "' to debug users list");
- }
- }
-
- public void remove(final String name) {
- debugUsers.remove(name);
- LOG.info("Removed '" + debugMode + "' from debug users list");
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsersView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsersView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsersView.java
deleted file mode 100644
index 360c48a..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsersView.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.debug;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class DebugUsersView extends AbstractElementProcessor {
-
- @Override
- public String getName() {
- return "debug-users";
- }
-
- @Override
- public void process(final Request request) {
- final String view = request.getContext().getContextPath() + request.getContext().getResourceParentPath() + request.getContext().getResourceFile();
-
- request.appendHtml("<form class=\"generic action\" action=\"debug-user.app\" method=\"post\" accept-charset=\"ISO-8859-1\">\n");
- request.appendHtml("<div class=\"title\">Add Debug User</div>\n");
- request.appendHtml("<div class=\"field\"><label>User Name:</label><input type=\"text\" name=\"name\" size=\"30\" /></div>\n");
- request.appendHtml("<input type=\"hidden\" name=\"method\" value=\"add\" />\n");
- request.appendHtml("<input type=\"hidden\" name=\"view\" value=\"" + view + "\" />\n");
- request.appendHtml("<input class=\"button\" type=\"submit\" value=\"Add User\" />\n");
- request.appendHtml("</form>\n");
-
- request.appendHtml("<table class=\"debug\">\n<tr><th class=\"title\">Name</th><th class=\"title\"></th></tr>\n");
- for (final String name : request.getContext().getDebugUsers()) {
- request.appendHtml("<tr><th>" + name + "</th><th><a href=\"debug-user.app?method=remove&name=" + name + "&view=" + view + " \">remove</a></th></tr>\n");
- }
- request.appendHtml("</table>\n");
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorDetails.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorDetails.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorDetails.java
deleted file mode 100644
index 3049b26..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorDetails.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.debug;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-
-public class ErrorDetails extends AbstractElementProcessor {
-
- public String getName() {
- return "error-details";
- }
-
- public void process(final Request request) {
- request.appendHtml(request.getContext().getErrorDetails());
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorMessage.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorMessage.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorMessage.java
deleted file mode 100644
index 07538ce..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorMessage.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.debug;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-
-public class ErrorMessage extends AbstractElementProcessor {
-
- public String getName() {
- return "error-message";
- }
-
- public void process(final Request request) {
- request.appendAsHtmlEncoded(request.getContext().getErrorMessage());
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorReference.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorReference.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorReference.java
deleted file mode 100644
index 75700cc..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorReference.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.debug;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-
-public class ErrorReference extends AbstractElementProcessor {
-
- public String getName() {
- return "error-reference";
- }
-
- public void process(final Request request) {
- request.appendAsHtmlEncoded(request.getContext().getErrorReference());
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/LogAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/LogAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/LogAction.java
deleted file mode 100644
index 6c30c19..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/LogAction.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.debug;
-
-import java.io.IOException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.viewer.scimpi.dispatcher.Action;
-import org.apache.isis.viewer.scimpi.dispatcher.NotLoggedInException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-
-public class LogAction implements Action {
-
- private static final Logger LOG = LoggerFactory.getLogger(LogAction.class);
-
- @Override
- public void process(final RequestContext context) throws IOException {
-
- final AuthenticationSession session = context.getSession();
- if (session == null) {
- throw new NotLoggedInException();
- }
-
- final String levelName = (String) context.getVariable("level");
-
- final org.apache.log4j.Level level = org.apache.log4j.Level.toLevel(levelName);
- boolean changeLogged = false;
- if (org.apache.log4j.Level.INFO.isGreaterOrEqual(org.apache.log4j.LogManager.getRootLogger().getLevel())) {
- LOG.info("log level changed to " + level);
- changeLogged = true;
- }
- org.apache.log4j.LogManager.getRootLogger().setLevel(level);
- if (!changeLogged) {
- LOG.info("log level changed to " + level);
- }
- final String view = (String) context.getVariable("view");
- context.setRequestPath(view);
-
- }
-
- @Override
- public String getName() {
- return "log";
- }
-
- @Override
- public void init() {
- }
-
- @Override
- public void debug(final DebugBuilder debug) {
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
deleted file mode 100644
index 852ccea..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.edit;
-
-import java.io.IOException;
-import java.util.List;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.commons.authentication.AnonymousSession;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.Veto;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.Action;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.NotLoggedInException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-
-public class EditAction implements Action {
- public static final String ACTION = "edit";
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- public String getName() {
- return ACTION;
- }
-
- @Override
- public void process(final RequestContext context) throws IOException {
- AuthenticationSession session = context.getSession();
- if (session == null) {
- session = new AnonymousSession();
- }
-
- try {
- final String objectId = context.getParameter("_" + OBJECT);
- final String version = context.getParameter("_" + VERSION);
- final String formId = context.getParameter("_" + FORM_ID);
- String resultName = context.getParameter("_" + RESULT_NAME);
- resultName = resultName == null ? RequestContext.RESULT : resultName;
- final String override = context.getParameter("_" + RESULT_OVERRIDE);
- String message = context.getParameter("_" + MESSAGE);
-
- final ObjectAdapter adapter = context.getMappedObject(objectId);
-
- final List<ObjectAssociation> fields = adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, adapter, where));
-
- for (final ObjectAssociation objectAssociation : fields) {
- if (objectAssociation.isVisible(session, adapter, where).isVetoed()) {
- throw new NotLoggedInException();
- }
- }
-
- final FormState entryState = validateObject(context, adapter, fields);
- final Version adapterVersion = adapter.getVersion();
- final Version formVersion = context.getVersion(version);
- if (formVersion != null && adapterVersion.different(formVersion)) {
-
- IsisContext.getMessageBroker().addMessage("The " + adapter.getSpecification().getSingularName() + " was edited " + "by another user (" + adapterVersion.getUser() + "). Please make your changes based on their changes.");
-
- final String view = context.getParameter("_" + ERROR);
- context.setRequestPath(view, Dispatcher.EDIT);
-
- entryState.setForm(formId);
- context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
- context.addVariable(resultName, objectId, Scope.REQUEST);
- if (override != null) {
- context.addVariable(resultName, override, Scope.REQUEST);
- }
-
- } else if (entryState.isValid()) {
- changeObject(context, adapter, entryState, fields);
-
- if (adapter.isTransient()) {
- IsisContext.getPersistenceSession().makePersistent(adapter);
- context.unmapObject(adapter, Scope.REQUEST);
- }
-
- String view = context.getParameter("_" + VIEW);
-
- final String id = context.mapObject(adapter, Scope.REQUEST);
- context.addVariable(resultName, id, Scope.REQUEST);
- if (override != null) {
- context.addVariable(resultName, override, Scope.REQUEST);
- }
-
- final int questionMark = view == null ? -1 : view.indexOf("?");
- if (questionMark > -1) {
- final String params = view.substring(questionMark + 1);
- final int equals = params.indexOf("=");
- context.addVariable(params.substring(0, equals), params.substring(equals + 1), Scope.REQUEST);
- view = view.substring(0, questionMark);
- }
- context.setRequestPath(view);
- if (message == null) {
- message = "Saved changes to " + adapter.getSpecification().getSingularName();
- } else if (message.equals("")) {
- message = null;
- }
- if (message != null) {
- final MessageBroker messageBroker = IsisContext.getMessageBroker();
- messageBroker.addMessage(message);
- }
-
- } else {
- final String view = context.getParameter("_" + ERROR);
- context.setRequestPath(view, Dispatcher.EDIT);
-
- entryState.setForm(formId);
- context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
- context.addVariable(resultName, objectId, Scope.REQUEST);
- if (override != null) {
- context.addVariable(resultName, override, Scope.REQUEST);
- }
-
- final MessageBroker messageBroker = IsisContext.getMessageBroker();
- messageBroker.addWarning(entryState.getError());
- }
-
- } catch (final RuntimeException e) {
- IsisContext.getMessageBroker().getMessages();
- IsisContext.getMessageBroker().getWarnings();
- throw e;
- }
- }
-
- private FormState validateObject(final RequestContext context, final ObjectAdapter object, final List<ObjectAssociation> fields) {
- final FormState formState = new FormState();
- for (int i = 0; i < fields.size(); i++) {
- final ObjectAssociation field = fields.get(i);
- final String fieldId = field.getId();
- String newEntry = context.getParameter(fieldId);
- if (fields.get(i).isOneToManyAssociation()) {
- continue;
- }
- if (fields.get(i).isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
- continue;
- }
- if (field.isUsable(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
- continue;
- }
-
- if (newEntry != null && newEntry.equals("-OTHER-")) {
- newEntry = context.getParameter(fieldId + "-other");
- }
-
- if (newEntry == null) {
- // TODO duplicated in EditObject; line 97
- final ObjectSpecification spec = field.getSpecification();
- if (spec.isOfType(IsisContext.getSpecificationLoader().loadSpecification(boolean.class)) || spec.isOfType(IsisContext.getSpecificationLoader().loadSpecification(Boolean.class))) {
- newEntry = FALSE;
- } else {
- continue;
- }
- }
- final FieldEditState fieldState = formState.createField(fieldId, newEntry);
-
- Consent consent = null;
- if (field.isMandatory() && (newEntry.equals("") || newEntry.equals("NULL"))) {
- consent = new Veto(field.getName() + " required");
- formState.setError("Not all fields have been set");
- } else if (field.getSpecification().containsFacet(ParseableFacet.class)) {
- try {
- final ParseableFacet facet = field.getSpecification().getFacet(ParseableFacet.class);
- final ObjectAdapter originalValue = field.get(object);
- Localization localization = IsisContext.getLocalization();
- final ObjectAdapter newValue = facet.parseTextEntry(originalValue, newEntry, localization);
- consent = ((OneToOneAssociation) field).isAssociationValid(object, newValue);
- fieldState.setValue(newValue);
- } catch (final TextEntryParseException e) {
- consent = new Veto(e.getMessage());
- // formState.setError("Not all fields have been entered correctly");
- }
-
- } else {
- final ObjectAdapter associate = newEntry.equals("null") ? null : context.getMappedObject(newEntry);
- if (associate != null) {
- IsisContext.getPersistenceSession().resolveImmediately(associate);
- }
- consent = ((OneToOneAssociation) field).isAssociationValid(object, associate);
- fieldState.setValue(associate);
-
- }
- if (consent.isVetoed()) {
- fieldState.setError(consent.getReason());
- formState.setError("Not all fields have been entered correctly");
- }
- }
-
- // TODO check the state of the complete object.
- return formState;
- }
-
- private void changeObject(final RequestContext context, final ObjectAdapter object, final FormState editState, final List<ObjectAssociation> fields) {
- for (int i = 0; i < fields.size(); i++) {
- final FieldEditState field = editState.getField(fields.get(i).getId());
- if (field == null) {
- continue;
- }
- final String newEntry = field.getEntry();
- final ObjectAdapter originalValue = fields.get(i).get(object);
- final boolean isVisible = fields.get(i).isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed();
- final boolean isUsable = fields.get(i).isUsable(IsisContext.getAuthenticationSession(), object, where).isAllowed();
- final boolean bothEmpty = originalValue == null && newEntry.equals("");
- final boolean bothSame = newEntry.equals(originalValue == null ? "" : originalValue.titleString());
- if ((!isVisible || !isUsable) || bothEmpty || bothSame) {
- if (fields.get(i).getSpecification().getFacet(ParseableFacet.class) == null) {
- // REVIEW restores object to loader
- context.getMappedObject(newEntry);
- }
- continue;
- }
-
- if (fields.get(i).getSpecification().containsFacet(ParseableFacet.class)) {
- final ParseableFacet facet = fields.get(i).getSpecification().getFacet(ParseableFacet.class);
- Localization localization = IsisContext.getLocalization();
- final ObjectAdapter newValue = facet.parseTextEntry(originalValue, newEntry, localization);
- ((OneToOneAssociation) fields.get(i)).set(object, newValue);
- } else {
- ((OneToOneAssociation) fields.get(i)).set(object, field.getValue());
- }
- }
- }
-
- @Override
- public void init() {
- }
-
- @Override
- public void debug(final DebugBuilder debug) {
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FieldEditState.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FieldEditState.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FieldEditState.java
deleted file mode 100644
index 70e6789..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FieldEditState.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.edit;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-
-public class FieldEditState {
- private final String entry;
- private String reason;
- private ObjectAdapter value;
-
- public FieldEditState(final String entry) {
- this.entry = entry;
- }
-
- public void setError(final String reason) {
- this.reason = reason;
- }
-
- public boolean isEntryValid() {
- return reason == null;
- }
-
- public String getEntry() {
- return entry;
- }
-
- public String getError() {
- return reason;
- }
-
- public ObjectAdapter getValue() {
- return value;
- }
-
- public void setValue(final ObjectAdapter value) {
- this.value = value;
- }
-
-}
[31/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.css b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.css
new file mode 100644
index 0000000..c665783
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.css
@@ -0,0 +1 @@
+@-webkit-keyframes fadeIn{0%{opacity:0}25%{opacity:.3}50%{opacity:.66}75%{opacity:1}}@keyframes fadeIn{0%{opacity:0}25%{opacity:.3}50%{opacity:.66}75%{opacity:1}}@-webkit-keyframes pulse{0%{text-shadow:0 0 10px rgba(255,255,255,.2),0 0 12px rgba(255,255,255,.2),0 0 16px rgba(255,255,255,.2)}25%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 6px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7)}50%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7)}75%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 25px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 12px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7),0 0 20px rgba(104,185,254,.7)}}@keyframes pulse{0%{text-shadow:0 0 10px rgba(255,255,255,.2),0 0 12px rgba(255,255,255,.2),0 0 16px rgba(255,255,255,.
2)}25%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 6px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7)}50%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7)}75%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 25px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 12px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7),0 0 20px rgba(104,185,254,.7)}}@-webkit-keyframes slide-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0%,0);transform:translate(0%,0)}}@keyframes slide-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0%,0);transform:translate(0%,0)}}@-webkit-keyframes slide-out{0%{-webkit-transform:translate(0%,0);transform:translate(0%,0
)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@keyframes slide-out{100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}svg{position:absolute;left:0;cursor:-webkit-grab;height:100%;width:100%;color:#333}.node{cursor:pointer}.node text.root{font-size:32px}.node text{display:none;fill:#fff;font-weight:200;text-anchor:middle;z-index:1000;text-shadow:1px 1px #333,-1px 1px #333,1px -1px #333,-1px -1px #333}.node.active{opacity:1}.node.active.selected text,.node.active:hover text{display:block}defs #arrow path{stroke:#CCC;stroke-opacity:.2;fill:#CCC;opacity:1}.edge text{stroke-width:0}.edge .edge-handler{fill:none;stroke:none}.edge .edge-line{fill:none}.edge.active text{display:none;fill:#fff;font-weight:200;text-anchor:middle;text-shadow:1px 1px #333,-1px 1px #333,1px -1px #333,-1px -1px #333;z-index:1000}.edge.active.selected,.edge.active:hover{cursor:pointer}.edge.active.highlight text,.edge.active.selected text,.edge.active:hover text{dis
play:block}#zoom-controls{background-color:transparent;background-image:url(images/maze-black.png);border-top-right-radius:3px;border-bottom-right-radius:3px;box-shadow:0 0 5px rgba(255,255,255,.3);margin-top:10%;z-index:5;position:relative;display:block;width:55px}#zoom-controls #zoom-in,#zoom-controls #zoom-out,#zoom-controls #zoom-reset{padding:12px;margin:0;width:100%}#zoom-controls #zoom-in i,#zoom-controls #zoom-out i,#zoom-controls #zoom-reset i{color:#E89619}#zoom-controls #zoom-in:hover,#zoom-controls #zoom-out:hover,#zoom-controls #zoom-reset:hover{background-color:rgba(255,255,255,.2)}#zoom-controls #zoom-in:active,#zoom-controls #zoom-out:active,#zoom-controls #zoom-reset:active{border:0}.fa-caret-down,.fa-caret-right,.fa-search{margin:0 5px;color:#e89619}#search{margin-top:2em;margin-bottom:1em;padding:.5em 1em;width:100%}#search span{vertical-align:bottom}#search input{background-color:#000;border:0;font-size:20px;color:#fff;padding-left:.5em}#search .search-icon{heigh
t:22px;background-color:#000;border-color:#000;border-right-color:#111}#stats{padding:.5em 1em;background-color:transparent;border-bottom:thin dashed #e89619}#stats #stats-header{padding:10px}#stats #all-stats{color:#fff;border-radius:none;border:0;background:0 0;overflow:auto}#stats #all-stats li{padding:3px}#stats #edge-stats-graph,#stats #node-stats-graph{height:250px}#stats #edge-stats-graph svg,#stats #node-stats-graph svg{opacity:.6;background:0 0}#stats #edge-stats-graph text,#stats #node-stats-graph text{font-size:16px;fill:#fff;font-weight:200;text-anchor:middle;z-index:1000}#stats #edge-stats-graph .no-data,#stats #node-stats-graph .no-data{margin:30px 0;color:#e89619}#stats .badge{border-radius:0;height:100%;background-color:rgba(104,185,254,.6)}#editor{padding:.5em 1em;background-color:transparent;border-bottom:thin dashed #e89619}#editor h3{padding:10px}#editor #element-options{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;cursor:
pointer;margin-top:10px;margin-left:2%;color:#fff}#editor #element-options #add-property-form,#editor #element-options .property{display:-webkit-inline-flex;display:inline-flex;margin:4px 0;width:100%}#editor #element-options #add-property-form #add-property #add-prop-value,#editor #element-options .property-value{border:thin rgba(255,255,255,.2) solid;border-left:0;background-color:#000;color:#fff;width:100%;border-top-left-radius:0;border-bottom-left-radius:0}#editor #element-options #add-property-form #add-property #add-prop-key,#editor #element-options .property-name{text-align:center;font-weight:200;cursor:default;background:#2E2E2E;border:thin transparent solid;color:#e89619;border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}#editor #element-options #update-properties,#editor #element-options input[type=submit]{color:#e89619;border-top-right-radius:4px;border-bottom-right-radius:4px;width:auto;background:rgba(255,255,255,.1);border:thin solid #e89619;text-al
ign:center}#editor #element-options #update-properties:active,#editor #element-options #update-properties:focus,#editor #element-options input[type=submit]:active,#editor #element-options input[type=submit]:focus{outline:0}#editor #element-options #update-properties:hover,#editor #element-options input[type=submit]:hover{color:#fff;border:thin solid #fff}#editor #element-options #update-properties{border-radius:4px;padding:10px;width:100%;margin-bottom:20px}#editor #element-options #add-property-form #add-property{display:-webkit-flex;display:flex;-webkit-flex-grow:2;flex-grow:2;-webkit-flex-direction:column;flex-direction:column}#editor #element-options #add-property-form #add-property #add-prop-value{text-align:center;width:100%;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border:thin rgba(255,255,255,.2) solid}#editor #element-options #add-property-form #add-property #add-prop-key{cursor:text;width:100%;border-top-left-radius:4px;border-bot
tom-left-radius:0}#editor #editor-interactions.active{color:#e89619}#editor #editor-interactions.inactive{color:#fff}#editor #edge-editor.enabled,#editor #node-editor.enabled{-webkit-animation:fadeIn 1s linear;animation:fadeIn 1s linear}#control-dash-wrapper{font-family:'Source Sans Pro',Helvetica,sans-serif;letter-spacing:.05em;height:inherit;z-index:inherit;padding:0}#control-dash-wrapper.initial{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}#control-dash-wrapper.initial #dash-toggle{color:#e89619;-webkit-animation:4s pulse linear;animation:4s pulse linear}#control-dash-wrapper.off-canvas{-webkit-transform:translate(-100%,0);transform:translate(-100%,0);-webkit-animation:slide-out .75s linear;animation:slide-out .75s linear}#control-dash-wrapper.off-canvas #dash-toggle{color:#e89619;-webkit-animation:4s pulse linear;animation:4s pulse linear}#control-dash-wrapper.on-canvas{-webkit-animation:slide-in .75s ease-in-out;animation:slide-in .75s ease-in-out}#control-
dash-wrapper.on-canvas *{box-shadow:none!important}#control-dash-wrapper.on-canvas #dash-toggle{color:rgba(232,150,25,.6)}#control-dash-wrapper.on-canvas #dash-toggle:hover{color:#e89619;-webkit-animation:4s pulse linear;animation:4s pulse linear}#control-dash-wrapper #control-dash{overflow-x:hidden;overflow-y:scroll;background-color:transparent;background-image:url(images/maze-black.png);padding:0;height:inherit;z-index:5}#control-dash-wrapper #control-dash h3{display:inline;margin:0}#control-dash-wrapper #dash-toggle{z-index:5;background-color:transparent;background-image:url(images/maze-black.png);border-top-right-radius:3px;border-bottom-right-radius:3px;box-shadow:0 0 5px rgba(255,255,255,.3);position:absolute;left:0;top:50%;font-size:2.2em;color:rgba(255,255,255,.2);padding:10px}#control-dash-wrapper button{border-radius:0;border:0;background-color:transparent}#control-dash-wrapper button:active{border:0}#control-dash-wrapper h3{font-weight:200;margin-top:10px;color:#fff;curso
r:pointer;vertical-align:top}#control-dash-wrapper li{cursor:pointer;background:0 0;border:0;border-radius:0}#clustering{padding:.5em 1em;cursor:pointer;color:#fff;border-bottom:thin dashed #E89619}#clustering #cluster-key-container,#clustering #cluster_control_header{padding:10px 10px 0}#clustering #cluster-key{color:#333;background-color:#000;border-radius:4px;border:thin solid #333;text-align:center;display:inline-block;width:100%}#filters{padding:.5em 1em;background-color:transparent;border-bottom:thin dashed #e89619;color:#fff}#filters form{width:100%}#filters #filter-header{padding:10px}#filters #filter-nodes,#filters #filter-relationships{background-color:transparent;display:inline-block;width:45%;margin-left:2%;overflow:auto;text-align:center;vertical-align:top}#filters #filter-nodes #filter-node-header,#filters #filter-nodes #filter-rel-header,#filters #filter-relationships #filter-node-header,#filters #filter-relationships #filter-rel-header{margin:10px 0;cursor:pointer;ba
ckground-color:transparent;border:0;border-radius:0;width:100%}#filters #filter-nodes #filter-node-header h4,#filters #filter-nodes #filter-rel-header h4,#filters #filter-relationships #filter-node-header h4,#filters #filter-relationships #filter-rel-header h4{font-weight:200;display:inline;color:#fff}#filters #filter-nodes #filter-node-header:active,#filters #filter-nodes #filter-rel-header:active,#filters #filter-relationships #filter-node-header:active,#filters #filter-relationships #filter-rel-header:active{border:0;box-shadow:none}#filters #filter-nodes #node-dropdown,#filters #filter-nodes #rel-dropdown,#filters #filter-relationships #node-dropdown,#filters #filter-relationships #rel-dropdown{margin:20px 0;border-radius:none;border:0;background:0 0}#filters #filter-nodes #node-dropdown li,#filters #filter-nodes #rel-dropdown li,#filters #filter-relationships #node-dropdown li,#filters #filter-relationships #rel-dropdown li{padding:5px}#filters #filter-nodes #node-dropdown li:h
over,#filters #filter-nodes #rel-dropdown li:hover,#filters #filter-relationships #node-dropdown li:hover,#filters #filter-relationships #rel-dropdown li:hover{background-color:rgba(255,255,255,.2)}#filters .disabled{color:rgba(255,255,255,.5)}#filters .disabled:hover{color:#fdc670}.alchemy{position:relative}.alchemy #search form{z-index:2;display:inline;margin-left:100px}.alchemy #add-tag{width:300px;display:inline-block}.alchemy #tags input{max-width:220px}.alchemy #tags-list{padding:0}.alchemy #tags-list .icon-remove-sign{cursor:pointer}.alchemy #tags-list li{display:inline-block;margin-top:5px}.alchemy #tags-list span{background-color:#ccc;color:#333;border-radius:10em;display:inline-block;padding:1px 6px}.alchemy #filter-nodes label,.alchemy #filter-relationships label{font-weight:400;margin-right:1em}.alchemy .clear{clear:both}.alchemy text{font-weight:200;text-anchor:middle}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.js b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.js
new file mode 100644
index 0000000..5f43854
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.js
@@ -0,0 +1,3 @@
+(function(){"Alchemy.js is a graph drawing application for the web.\nCopyright (C) 2014 GraphAlchemist, Inc.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\nlets";var a,b,c,d,e,f,g,h,i,j,k,l,m=[].slice,n=function(a,b){return function(){return a.apply(b,arguments)}};a=function(){function a(a){null==a&&(a=null),this.a=this,this.version="0.4.1",this.get=new this.Get(this),this.remove=new this.Rem
ove(this),this.create=new this.Create(this),this.set=new this.Set(this),this.drawing={DrawEdge:c(this),DrawEdges:d(this),DrawNode:e(this),DrawNodes:f(this),EdgeUtils:this.EdgeUtils(this),NodeUtils:this.NodeUtils(this)},this.controlDash=this.controlDash(this),this.stats=this.stats(this),this.layout=j,this.clustering=b,this.models={Node:this.Node(this),Edge:this.Edge(this)},this.utils={warnings:new l(this)},this.filters=this.filters(this),this.exports=this.exports(this),this.visControls={},this.styles={},this.editor={},this.log={},this.state={interactions:"default",layout:"default"},this.startGraph=this.startGraph(this),this.updateGraph=this.updateGraph(this),this.generateLayout=this.generateLayout(this),this.svgStyles=this.svgStyles(this),this.interactions=this.interactions(this),this.search=this.search(this),this.plugins=this.plugins(this),this._nodes={},this._edges={},this.getNodes=this.get.getNodes,this.getEdges=this.get.getEdges,this.allNodes=this.get.allNodes,this.allEdges=this.
get.allEdges,a&&this.begin(a)}return a.prototype.begin=function(b){var c;switch(c=this.setConf(b),typeof this.conf.dataSource){case"string":d3.json(this.a.conf.dataSource,this.a.startGraph);break;case"object":this.a.startGraph(this.a.conf.dataSource)}return this.plugins.init(),a.prototype.instances.push(this),this},a.prototype.setConf=function(a){var b,c;null!=a.theme&&(a=_.merge(_.cloneDeep(this.defaults),this.a.themes[""+a.theme]));for(b in a)switch(c=a[b],b){case"clusterColors":a.clusterColours=c;break;case"backgroundColor":a.backgroundColour=c;break;case"nodeColor":a[nodeColour]=c}return this.a.conf=_.merge(_.cloneDeep(this.defaults),a)},a.prototype.instances=[],a.prototype.getInst=function(b){var c;return c=parseInt(d3.select(b).attr("alchInst")),a.prototype.instances[c]},a}(),k="undefined"!=typeof exports&&null!==exports?exports:this,k.Alchemy=a,k.alchemy={begin:function(b){return k.alchemy=new a(b)}},a.prototype.Create=function(){function a(a){this.a=a}return a.prototype.node
s=function(){var a,b,c,d,e,f,g;for(c=arguments[0],d=2<=arguments.length?m.call(arguments,1):[],a=this.a,e=function(b){var c;return a._nodes[b.id]?console.warn("A node with the id "+b.id+" already exists.\nConsider using the @a.get.nodes() method to \nretrieve the node and then using the Node methods."):(c=new a.models.Node(b),a._nodes[b.id]=c,[c])},d=_.union(d,c),f=0,g=d.length;g>f;f++)b=d[f],e(b);return this.a.initial?this.a.updateGraph():void 0},a.prototype.edges=function(){var a,b,c,d,e;return c=arguments[0],d=2<=arguments.length?m.call(arguments,1):[],a=this.a,e=function(b){var c,d;return b.id&&!a._edges[b.id]?(c=new a.models.Edge(b),a._edges[b.id]=[c],[c]):b.id&&a._edges[b.id]?console.warn("An edge with that id "+someEdgeMap.id+" already exists.\nConsider using the @a.get.edge() method to \nretrieve the edge and then using the Edge methods.\nNote: id's are not required for edges. Alchemy will create\nan unlimited number of edges for the same source and target node.\nSimply omi
t 'id' when creating the edge."):(d=a._edges[""+b.source+"-"+b.target],d?(c=new a.models.Edge(b,d.length),d.push(c),[c]):(c=new a.models.Edge(b,0),a._edges[""+b.source+"-"+b.target]=[c],[c]))},b=_.uniq(_.flatten(arguments)),_.each(b,function(a){return e(a)}),this.a.initial?this.a.updateGraph():void 0},a}(),a.prototype.Get=function(a){return{a:a,_el:[],_elType:null,_makeChain:function(a){var b;for(b=this,b.__proto__=[].__proto__;b.length;)b.pop();return _.each(a,function(a){return b.push(a)}),b},nodes:function(){var a,b,c,d,e;return c=arguments[0],d=2<=arguments.length?m.call(arguments,1):[],null!=c&&(b=_.map(arguments,function(a){return String(a)}),a=this.a,e=function(a){return _.filter(a._nodes,function(a,c){return _.contains(b,c)?a:void 0})}(a)),this._elType="node",this._el=e,this._makeChain(e)},edges:function(){var a,b,c,d,e;return d=arguments[0],e=2<=arguments.length?m.call(arguments,1):[],null!=d&&(b=_.map(arguments,function(a){return String(a)}),a=this.a,c=function(a){return _
.flatten(_.filter(a._edges,function(a,c){return _.contains(b,c)?a:void 0}))}(a)),this._elType="edge",this._el=c,this._makeChain(c)},all:function(){var a,b;return a=this.a,b=this._elType,this._el=function(b){switch(b){case"node":return a.elements.nodes.val;case"edge":return a.elements.edges.flat}}(b),this._makeChain(this._el)},elState:function(a){var b;return b=_.filter(this._el,function(b){return b._state===a}),this._el=b,this._makeChain(b)},state:function(){return null!=this.a.state.key?this.a.state.key:void 0},type:function(a){var b;return b=_.filter(this._el,function(b){return b._nodeType===a||b._edgeType===a}),this._el=b,this._makeChain(b)},activeNodes:function(){return _.filter(this.a._nodes,function(a){return"active"===a._state?a:void 0})},activeEdges:function(){return _.filter(this.a.get.allEdges(),function(a){return"active"===a._state?a:void 0})},state:function(){return null!=this.a.state.key?this.a.state.key:void 0},clusters:function(){var a,b;return a=this.a.layout._cluste
ring.clusterMap,b={},_.each(a,function(a,c){return b[c]=_.select(this.a.get.allNodes(),function(a){return a.getProperties()[this.a.conf.clusterKey]===c})}),b},clusterColours:function(){var a,b;return b=this.a.layout._clustering.clusterMap,a={},_.each(b,function(b,c){return a[c]=this.a.conf.clusterColours[b%this.a.conf.clusterColours.length]}),a},allEdges:function(){return this.a.elements.nodes.flat},allNodes:function(a){return null!=a?_.filter(this.a._nodes,function(b){return b._nodeType===a?b:void 0}):this.a.elements.nodes.val},getNodes:function(){var a,b,c;return b=arguments[0],c=2<=arguments.length?m.call(arguments,1):[],a=this.a,c.push(b),_.map(c,function(b){return a._nodes[b]})},getEdges:function(a,b){var c,d;return null==a&&(a=null),null==b&&(b=null),c=this.a,null!=a&&null!=b?(d=""+a+"-"+b,this.a._edges[d]):null!=a&&null==b?this.a._nodes[a]._adjacentEdges:void 0}}},a.prototype.Remove=function(){function a(a){this.a=a}return a.prototype.nodes=function(a){return _.each(a,functio
n(a){return null!=a._nodeType?a.remove():void 0})},a.prototype.edges=function(a){return _.each(a,function(a){return null!=a._edgeType?a.remove():void 0})},a}(),a.prototype.Set=function(a){return{a:a,state:function(a,b){return this.a.state.key=b}}},b=function(){function a(a){var b,c,d,e,f,g,h,i;this.a=a,d=this.a._nodes,c=this.a.conf,b=this,this.clusterKey=c.clusterKey,this.identifyClusters(this.a),e=-500,i=function(a){var b,c;return b=d[a.source.id]._properties[this.clusterKey],c=d[a.target.id]._properties[this.clusterKey],b===c?.15:0},f=function(){return.7},h=function(a){return d=a.self.a._nodes,d[a.source.id]._properties.root||d[a.target.id]._properties.root?300:d[a.source.id]._properties[this.clusterKey]===d[a.target.id]._properties[this.clusterKey]?10:600},g=function(a){return 8*a},this.layout={charge:e,linkStrength:function(a){return i(a)},friction:function(){return f()},linkDistancefn:function(a){return h(a)},gravity:function(a){return g(a)}}}return a.prototype.identifyClusters
=function(a){var b,c,d;return c=a.elements.nodes.val,b=_.uniq(_.map(c,function(b){return b.getProperties()[a.conf.clusterKey]})),this.clusterMap=_.zipObject(b,function(){d=[];for(var a=0,c=b.length;c>=0?c>=a:a>=c;c>=0?a++:a--)d.push(a);return d}.apply(this))},a.prototype.getClusterColour=function(a){var b;return b=this.clusterMap[a]%this.a.conf.clusterColours.length,this.a.conf.clusterColours[b]},a.prototype.edgeGradient=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;for(c=this.a.vis.select(""+this.a.conf.divSelector+" svg"),b={},j=this.a._nodes,n=_.map(a,function(a){return a._d3}),l=0,m=n.length;m>l;l++)if(d=n[l],!j[d.source.id]._properties.root&&!j[d.target.id]._properties.root&&j[d.source.id]._properties[this.clusterKey]!==j[d.target.id]._properties[this.clusterKey]&&j[d.target.id]._properties[this.clusterKey]!==j[d.source.id]._properties[this.clusterKey]){if(h=j[d.source.id]._properties[this.clusterKey]+"-"+j[d.target.id]._properties[this.clusterKey],h in b)continue;h in b||(k=this
.getClusterColour(j[d.target.id]._properties[this.clusterKey]),e=this.getClusterColour(j[d.source.id]._properties[this.clusterKey]),b[h]={startColour:k,endColour:e})}o=[];for(i in b)g="cluster-gradient-"+i,f=c.append("svg:linearGradient").attr("id",g),f.append("svg:stop").attr("offset","0%").attr("stop-color",b[i].startColour),o.push(f.append("svg:stop").attr("offset","100%").attr("stop-color",b[i].endColour));return o},a}(),a.prototype.clusterControls={init:function(){var a;return a="<input class='form-control form-inline' id='cluster-key' placeholder=\"Cluster Key\"></input>",this.a.dash.select("#clustering-container").append("div").attr("id","cluster-key-container").attr("class","property form-inline form-group").html(a).style("display","none"),this.a.dash.select("#cluster_control_header").on("click",function(){var a,b;return b=this.a.dash.select("#cluster-key-container"),a=b.style("display")}),element.style("display",function(){return"block"===display?"none":"block"}),"none"===t
his.a.dash.select("#cluster-key-container").style("display")?this.a.dash.select("#cluster-arrow").attr("class","fa fa-2x fa-caret-right"):this.a.dash.select("#cluster-arrow").attr("class","fa fa-2x fa-caret-down"),this.a.dash.select("#cluster-key").on("keydown",function(){return"Enter"===d3.event.keyIdentifier?(this.a.conf.cluster=!0,this.a.conf.clusterKey=this.value,this.a.generateLayout()):void 0})}},a.prototype.controlDash=function(a){var b;return b=a,{init:function(){var a;return this.dashIsShown()?(a=b.conf.divSelector,b.dash=d3.select(""+a).append("div").attr("id","control-dash-wrapper").attr("class","col-md-4 initial"),b.dash.append("i").attr("id","dash-toggle").attr("class","fa fa-flask col-md-offset-12"),b.dash.append("div").attr("id","control-dash").attr("class","col-md-12"),b.dash.select("#dash-toggle").on("click",b.interactions.toggleControlDash),b.controlDash.zoomCtrl(),b.controlDash.search(),b.controlDash.filters(),b.controlDash.stats(),b.controlDash.clustering(),b.con
trolDash.exports()):void 0},search:function(){return b.conf.search?(b.dash.select("#control-dash").append("div").attr("id","search").html("<div class='input-group'>\n <input class='form-control' placeholder='Search'>\n <i class='input-group-addon search-icon'><span class='fa fa-search fa-1x'></span></i>\n</div> "),b.search.init()):void 0},zoomCtrl:function(){return b.conf.zoomControls?(b.dash.select("#control-dash-wrapper").append("div").attr("id","zoom-controls").attr("class","col-md-offset-12").html("<button id='zoom-reset' class='btn btn-defualt btn-primary'><i class='fa fa-crosshairs fa-lg'></i></button> <button id='zoom-in' class='btn btn-defualt btn-primary'><i class='fa fa-plus'></i></button> <button id='zoom-out' class='btn btn-default btn-primary'><i class='fa fa-minus'></i></button>"),b.dash.select("#zoom-in").on("click",function(){return b.interactions.clickZoom("in")}),b.dash.select("#zoom-out").on("click",function(){return b.interactions.clickZoom("out")}),b.das
h.select("#zoom-reset").on("click",function(){return b.interactions.clickZoom("reset")})):void 0},filters:function(){return b.conf.nodeFilters||b.conf.edgeFilters?(b.dash.select("#control-dash").append("div").attr("id","filters"),b.filters.init()):void 0},stats:function(){var a;return b.conf.nodeStats||b.conf.edgeStats?(a='<div id = "stats-header" data-toggle="collapse" data-target="#stats #all-stats">\n<h3>\n Statistics\n</h3>\n<span class = "fa fa-caret-right fa-2x"></span>\n</div>\n<div id="all-stats" class="collapse">\n <ul class = "list-group" id="node-stats"></ul>\n <ul class = "list-group" id="rel-stats"></ul> \n</div>',b.dash.select("#control-dash").append("div").attr("id","stats").html(a).select("#stats-header").on("click",function(){return b.dash.select("#all-stats").classed("in")?b.dash.select("#stats-header>span").attr("class","fa fa-2x fa-caret-right"):b.dash.select("#stats-header>span").attr("class","fa fa-2x fa-caret-down")}),b.stats.init()):void 0},exports:
function(){var a;return b.conf.exportSVG?(a='<div id="exports-header" data-toggle="collapse" data-target="#all-exports" style="padding:10px;">\n <h3>\n Exports\n </h3>\n <span class="fa fa-caret-right fa-2x"></span>\n</div>\n<div id="all-exports" class="collapse"></div>',b.dash.select("#control-dash").append("div").attr("id","exports").attr("style","padding: 0.5em 1em; border-bottom: thin dashed #E89619; color: white;").html(a).select("#exports-header"),b.exports.init()):void 0},clustering:function(){var a;return b.conf.clusterControl?(a='<div id="clustering-container">\n <div id="cluster_control_header" data-toggle="collapse" data-target="#clustering #cluster-options">\n <h3>Clustering</h3>\n <span id="cluster-arrow" class="fa fa-2x fa-caret-right"></span>\n </div>\n</div>',b.dash.select("#control-dash").append("div").attr("id","clustering").html(a).select("#cluster_control_header"),b.clusterControls.init()):void 0},dashIsShown:function(){var a;
return a=b.conf,a.showEditor||a.captionToggle||a.toggleRootNodes||a.removeElement||a.clusterControl||a.nodeStats||a.edgeStats||a.edgeFilters||a.nodeFilters||a.edgesToggle||a.nodesToggle||a.search||a.exportSVG}}},a.prototype.filters=function(){return function(a){var b;return b=a,{init:function(){var a,c,d,e,f,g,h,i,j,k,l,m;if(b.filters.show(),b.conf.edgeFilters&&b.filters.showEdgeFilters(),b.conf.nodeFilters&&b.filters.showNodeFilters(),b.conf.nodeTypes){for(e=Object.keys(b.conf.nodeTypes),g="",m=b.conf.nodeTypes[e],i=0,k=m.length;k>i;i++)f=m[i],a=f.replace("_"," "),g+="<li class='list-group-item nodeType' role='menuitem' id='li-"+f+"' name="+f+">"+a+"</li>";b.dash.select("#node-dropdown").html(g)}if(b.conf.edgeTypes){for(h=_.isPlainObject(b.conf.edgeTypes)?_.values(b.conf.edgeTypes)[0]:b.conf.edgeTypes,d="",j=0,l=h.length;l>j;j++)c=h[j],a=c.replace("_"," "),d+="<li class='list-group-item edgeType' role='menuitem' id='li-"+c+"' name="+c+">"+a+"</li>";b.dash.select("#rel-dropdown").ht
ml(d)}return b.conf.captionsToggle&&b.filters.captionsToggle(),b.conf.edgesToggle&&b.filters.edgesToggle(),b.conf.nodesToggle&&b.filters.nodesToggle(),b.filters.update()},show:function(){var a;return a='<div id = "filter-header" data-toggle="collapse" data-target="#filters form">\n <h3>Filters</h3>\n <span class = "fa fa-2x fa-caret-right"></span>\n</div>\n <form class="form-inline collapse">\n </form>',b.dash.select("#control-dash #filters").html(a),b.dash.selectAll("#filter-header").on("click",function(){return b.dash.select("#filters>form").classed("in")?b.dash.select("#filter-header>span").attr("class","fa fa-2x fa-caret-right"):b.dash.select("#filter-header>span").attr("class","fa fa-2x fa-caret-down")}),b.dash.select("#filters form")},showEdgeFilters:function(){var a;return a='<div id="filter-rel-header" data-target = "#rel-dropdown" data-toggle="collapse">\n <h4>\n Edge Types\n </h4>\n <span class="fa fa-lg fa-caret-right"></span>\n</div>\n<ul id="
rel-dropdown" class="collapse list-group" role="menu">\n</ul>',b.dash.select("#filters form").append("div").attr("id","filter-relationships").html(a),b.dash.select("#filter-rel-header").on("click",function(){return b.dash.select("#rel-dropdown").classed("in")?b.dash.select("#filter-rel-header>span").attr("class","fa fa-lg fa-caret-right"):b.dash.select("#filter-rel-header>span").attr("class","fa fa-lg fa-caret-down")})},showNodeFilters:function(){var a;return a='<div id="filter-node-header" data-target = "#node-dropdown" data-toggle="collapse">\n <h4>\n Node Types\n </h4>\n <span class="fa fa-lg fa-caret-right"></span>\n</div>\n<ul id="node-dropdown" class="collapse list-group" role="menu">\n</ul>',b.dash.select("#filters form").append("div").attr("id","filter-nodes").html(a),b.dash.select("#filter-node-header").on("click",function(){return b.dash.select("#node-dropdown").classed("in")?b.dash.select("#filter-node-header>span").attr("class","fa fa-lg fa-caret-right"):
b.dash.select("#filter-node-header>span").attr("class","fa fa-lg fa-caret-down")})},captionsToggle:function(){return b.dash.select("#filters form").append("li").attr({id:"toggle-captions","class":"list-group-item active-label toggle"}).html("Show Captions").on("click",function(){var a;return a=b.dash.select("g text").attr("style"),"display: block"===a?b.dash.selectAll("g text").attr("style","display: none"):b.dash.selectAll("g text").attr("style","display: block")})},edgesToggle:function(){return b.dash.select("#filters form").append("li").attr({id:"toggle-edges","class":"list-group-item active-label toggle"}).html("Toggle Edges").on("click",function(){return _.contains(_.pluck(_.flatten(_.values(b._edges)),"_state"),"active")?_.each(_.values(b._edges),function(a){return _.each(a,function(a){return"active"===a._state?a.toggleHidden():void 0})}):_.each(_.values(b._edges),function(a){return _.each(a,function(a){var c,d;return c=b._nodes[a._properties.source],d=b._nodes[a._properties.t
arget],"active"===c._state&&"active"===d._state?a.toggleHidden():void 0})})})},nodesToggle:function(){return b.dash.select("#filters form").append("li").attr({id:"toggle-nodes","class":"list-group-item active-label toggle"}).html("Toggle Nodes").on("click",function(){var a;return a=_.values(b._nodes),_.contains(_.pluck(a,"_state"),"active")?_.each(a,function(a){return b.conf.toggleRootNodes&&a._d3.root?void 0:"active"===a._state?a.toggleHidden():void 0}):_.each(_.values(b._nodes),function(a){return b.conf.toggleRootNodes&&a._d3.root?void 0:a.toggleHidden()})})},update:function(){return b.dash.selectAll(".nodeType, .edgeType").on("click",function(){var a,c;return a=d3.select(this),c=a.attr("name"),b.vis.selectAll("."+c).each(function(a){var c,d,e,f;return null!=b._nodes[a.id]?(d=b._nodes[a.id],d.toggleHidden()):(c=b._edges[a.id][0],e=b._nodes[c._properties.source],f=b._nodes[c._properties.target],"active"===e._state&&"active"===f._state?c.toggleHidden():void 0)}),b.stats.nodeStats()}
)}}}}(this),a.prototype.Index=function(a){var b,c,d,e;return b=a,d={nodes:{val:function(){return _.values(b._nodes)}()},edges:{val:function(){return _.values(b._edges)}()}},e=d.nodes,c=d.edges,d.edges.flat=function(){return _.flatten(c.val)}(),d.nodes.d3=function(){return _.map(e.val,function(a){return a._d3})}(),d.edges.d3=function(){return _.map(c.flat,function(a){return a._d3})}(),b.elements=d,function(){return b.elements.nodes.svg=function(){return b.vis.selectAll("g.node")}(),b.elements.edges.svg=function(){return b.vis.selectAll("g.edge")}()}},a.prototype.interactions=function(b){var c;return c=b,{edgeClick:function(a){var b;if(!d3.event.defaultPrevented)return d3.event.stopPropagation(),b=a.self,"function"==typeof c.conf.edgeClick&&c.conf.edgeClick(b),"hidden"!==b._state?(b._state=function(){return"selected"===b._state?"active":"selected"}(),b.setStyles()):void 0},edgeMouseOver:function(a){var b;return b=a.self,"hidden"!==b._state?("selected"!==b._state&&(b._state="highlighte
d"),b.setStyles()):void 0},edgeMouseOut:function(a){var b;return b=a.self,"hidden"!==b._state?("selected"!==b._state&&(b._state="active"),b.setStyles()):void 0},nodeMouseOver:function(a){var b;if(b=a.self,"hidden"!==b._state){if("selected"!==b._state&&(b._state="highlighted",b.setStyles()),"function"==typeof c.conf.nodeMouseOver)return c.conf.nodeMouseOver(b);if("number"==typeof c.conf.nodeMouseOver)return b.properties[c.conf.nodeMouseOver]}},nodeMouseOut:function(a){var b;return b=a.self,c=b.a,"hidden"!==b._state&&("selected"!==b._state&&(b._state="active",b.setStyles()),null!=c.conf.nodeMouseOut&&"function"==typeof c.conf.nodeMouseOut)?c.conf.nodeMouseOut(a):void 0},nodeClick:function(a){var b;if(!d3.event.defaultPrevented)return d3.event.stopPropagation(),b=a.self,"function"==typeof c.conf.nodeClick&&c.conf.nodeClick(b),"hidden"!==b._state?(b._state=function(){return"selected"===b._state?"active":"selected"}(),b.setStyles()):void 0},zoom:function(b){return null==this._zoomBehavio
r&&(this._zoomBehavior=d3.behavior.zoom()),this._zoomBehavior.scaleExtent(b).on("zoom",function(){return c=a.prototype.getInst(this),c.vis.attr("transform","translate("+d3.event.translate+") scale("+d3.event.scale+")")})},clickZoom:function(a){var b,d,e,f;return f=c.vis.attr("transform").match(/(-*\d+\.*\d*)/g).map(function(a){return parseFloat(a)}),d=f[0],e=f[1],b=f[2],c.vis.attr("transform",function(){return"in"===a?(b<c.conf.scaleExtent[1]&&(b+=.2),"translate("+d+","+e+") scale("+b+")"):"out"===a?(b>c.conf.scaleExtent[0]&&(b-=.2),"translate("+d+","+e+") scale("+b+")"):"reset"===a?"translate(0,0) scale(1)":console.log("error")}),null==this._zoomBehavior&&(this._zoomBehavior=d3.behavior.zoom()),this._zoomBehavior.scale(b).translate([d,e])},nodeDragStarted:function(a){return d3.event.preventDefault,d3.event.sourceEvent.stopPropagation(),d3.select(this).classed("dragging",!0),a.fixed=!0},nodeDragged:function(a){var b,d;return c=a.self.a,a.x+=d3.event.dx,a.y+=d3.event.dy,a.px+=d3.even
t.dx,a.py+=d3.event.dy,d=d3.select(this),d.attr("transform","translate("+a.x+", "+a.y+")"),b=a.self._adjacentEdges,_.each(b,function(a){var b;return b=c.vis.select("#edge-"+a.id+"-"+a._index),c._drawEdges.updateEdge(b.data()[0])})},nodeDragended:function(a){return c=a.self.a,d3.select(this).classed({dragging:!1}),c.conf.forceLocked?void 0:c.force.start()},nodeDoubleClick:function(){return null},deselectAll:function(){var b;return c=a.prototype.getInst(this),(null!=(b=d3.event)?b.defaultPrevented:0)?void 0:(c.conf.showEditor===!0&&c.modifyElements.nodeEditorClear(),_.each(c._nodes,function(a){return a._state="active",a.setStyles()}),_.each(c._edges,function(a){return _.each(a,function(a){return a._state="active",a.setStyles()})}),c.conf.deselectAll?c.conf.deselectAll():void 0)}}},j=function(){function a(a){this.tick=n(this.tick,this),this.linkStrength=n(this.linkStrength,this),this.gravity=n(this.gravity,this);var b,c,d;this.a=b=a,c=this.a.conf,d=this.a._nodes,this.k=Math.sqrt(Math.l
og(_.size(this.a._nodes))/(c.graphWidth()*c.graphHeight())),this._clustering=new this.a.clustering(this.a),this.d3NodeInternals=b.elements.nodes.d3,c.cluster?(this._charge=function(){return this._clustering.layout.charge},this._linkStrength=function(a){return this._clustering.layout.linkStrength(a)}):(this._charge=function(){return-10/this.k},this._linkStrength=function(a){return d[a.source.id].getProperties("root")||d[a.target.id].getProperties("root")?1:.9}),c.cluster?this._linkDistancefn=function(a){return this._clustering.layout.linkDistancefn(a)}:"default"===c.linkDistancefn?this._linkDistancefn=function(){return 1/(50*this.k)}:"number"==typeof c.linkDistancefn?this._linkDistancefn=function(){return c.linkDistancefn}:"function"==typeof c.linkDistancefn&&(this._linkDistancefn=function(a){return c.linkDistancefn(a)})}return a.prototype.gravity=function(){return this.a.conf.cluster?this._clustering.layout.gravity(this.k):50*this.k},a.prototype.linkStrength=function(a){return this.
_linkStrength(a)},a.prototype.friction=function(){return.9},a.prototype.collide=function(a){var b,c,d,e,f,g;return b=this.a.conf,g=2*(a.radius+a["stroke-width"])+b.nodeOverlap,c=a.x-g,d=a.x+g,e=a.y-g,f=a.y+g,function(h,i,j,k,l){var m,n,o;return h.point&&h.point!==a&&(n=a.x-Math.abs(h.point.x),o=a.y-h.point.y,m=Math.sqrt(n*n+o*o),g=g,g>m&&(m=(m-g)/m*b.alpha,a.x-=n*=m,a.y-=o*=m,h.point.x+=n,h.point.y+=o)),i>d||c>k||j>f||e>l}},a.prototype.tick=function(){var a,b,c,d,e,f,g,h;if(a=this.a,d=a.elements.nodes.svg,b=a.elements.edges.svg,a.conf.collisionDetection)for(e=d3.geom.quadtree(this.d3NodeInternals),h=this.d3NodeInternals,f=0,g=h.length;g>f;f++)c=h[f],e.visit(this.collide(c));return d.attr("transform",function(a){return"translate("+a.x+","+a.y+")"}),this.drawEdge=a.drawing.DrawEdge,this.drawEdge.styleText(b),this.drawEdge.styleLink(b)},a.prototype.positionRootNodes=function(){var a,b,c,d,e,f,g,h,i,j;if(a=this.a.conf,b={width:a.graphWidth(),height:a.graphHeight()},e=_.filter(this.a.ele
ments.nodes.val,function(a){return a.getProperties("root")}),1!==e.length){for(j=[],c=f=0,g=e.length;g>f;c=++f)d=e[c],d._d3.x=b.width/Math.sqrt(e.length*(c+1)),d._d3.y=b.height/2,j.push(d._d3.fixed=!0);return j}d=e[0],h=[b.width/2,b.width/2],d._d3.x=h[0],d._d3.px=h[1],i=[b.height/2,b.height/2],d._d3.y=i[0],d._d3.py=i[1],d._d3.fixed=!0},a.prototype.chargeDistance=function(){return 500},a.prototype.linkDistancefn=function(a){return this._linkDistancefn(a)},a.prototype.charge=function(){return this._charge()},a}(),a.prototype.generateLayout=function(a){var b;return b=a,function(a){var c;return null==a&&(a=!1),c=b.conf,b.layout=new j(b),b.force=d3.layout.force().size([c.graphWidth(),c.graphHeight()]).theta(1).gravity(b.layout.gravity()).friction(b.layout.friction()).nodes(b.elements.nodes.d3).links(b.elements.edges.d3).linkDistance(function(a){return b.layout.linkDistancefn(a)}).linkStrength(function(a){return b.layout.linkStrength(a)}).charge(b.layout.charge()).chargeDistance(b.layout.
chargeDistance())}},a.prototype.search=function(a){var b;return b=a,{init:function(){var a;return a=b.dash.select("#search input"),a.on("keyup",function(){var c;return c=a[0][0].value.toLowerCase(),b.vis.selectAll(".node").classed("inactive",!1),b.vis.selectAll("text").attr("style",function(){return""!==c?"display: inline;":void 0}),b.vis.selectAll(".node").classed("inactive",function(a){var d,e;switch(d=d3.select(this).text(),b.conf.searchMethod){case"contains":e=d.toLowerCase().indexOf(c)<0;break;case"begins":e=0!==d.toLowerCase().indexOf(c)}return e?b.vis.selectAll("[source-target*='"+a.id+"']").classed("inactive",e):b.vis.selectAll("[source-target*='"+a.id+"']").classed("inactive",function(a){var c,d,e;return c=[a.source.id,a.target.id],d=b.vis.select("#node-"+c[0]).classed("inactive"),e=b.vis.select("#node-"+c[1]).classed("inactive"),e||d}),e})})}}},a.prototype.startGraph=function(b){var c;return c=b,function(b){var d,e,f,g,h,i;if(d=c.conf,d3.select(d.divSelector).empty()&&cons
ole.warn(c.utils.warnings.divWarning()),b||(b={nodes:[],edges:[]},c.utils.warnings.dataWarning()),null==b.edges&&(b.edges=[]),c.create.nodes(b.nodes),b.edges.forEach(function(a){return c.create.edges(a)}),c.vis=d3.select(d.divSelector).attr("style","width:"+d.graphWidth()+"px; height:"+d.graphHeight()+"px; background:"+d.backgroundColour+";").append("svg").attr("xmlns","http://www.w3.org/2000/svg").attr("xlink","http://www.w3.org/1999/xlink").attr("pointer-events","all").attr("style","background:"+d.backgroundColour+";").attr("alchInst",a.prototype.instances.length-1).on("click",c.interactions.deselectAll).call(c.interactions.zoom(d.scaleExtent)).on("dblclick.zoom",null).append("g").attr("transform","translate("+d.initialTranslate+") scale("+d.initialScale+")"),c.interactions.zoom().scale(d.initialScale),c.interactions.zoom().translate(d.initialTranslate),c.index=a.prototype.Index(c),c.generateLayout(),c.controlDash.init(),e=c.elements.edges.d3,f=c.elements.nodes.d3,c.layout.positio
nRootNodes(),c.force.start(),d.forceLocked)for(;c.force.alpha()>.005;)c.force.tick();return c._drawEdges=c.drawing.DrawEdges,c._drawNodes=c.drawing.DrawNodes,c._drawEdges.createEdge(e),c._drawNodes.createNode(f),c.index(),c.elements.nodes.svg.attr("transform",function(a){return"translate("+a.x+", "+a.y+")"}),console.log(Date()+" completed initial computation"),d.forceLocked||c.force.on("tick",c.layout.tick).start(),null!=d.afterLoad&&("function"==typeof d.afterLoad?d.afterLoad():"string"==typeof d.afterLoad&&(c[d.afterLoad]=!0)),d.cluster&&(g=d3.select(""+c.conf.divSelector+" svg").append("svg:defs")),d.nodeStats&&c.stats.nodeStats(),d.showEditor&&(h=new c.editor.Editor,i=new c.editor.Interactions,d3.select("body").on("keydown",i.deleteSelected),h.startEditor()),c.initial=!0}},a.prototype.stats=function(a){var b;return b=a,{init:function(){return b.stats.update()},nodeStats:function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o;if(f=[],c=b.get.allNodes().length,a=b.get.activeNodes().length,e=c-
a,j="<li class = 'list-group-item gen_node_stat'>Number of nodes: <span class='badge'>"+c+"</span></li> <li class = 'list-group-item gen_node_stat'>Number of active nodes: <span class='badge'>"+a+"</span></li> <li class = 'list-group-item gen_node_stat'>Number of inactive nodes: <span class='badge'>"+e+"</span></li></br>",b.conf.nodeTypes){for(h=Object.keys(b.conf.nodeTypes),l="",o=b.conf.nodeTypes[h],m=0,n=o.length;n>m;m++)k=o[m],d=k.replace("_"," "),i=b.vis.selectAll("g.node."+k)[0].length,l+="<li class = 'list-group-item nodeType' id='li-"+k+"' name = "+d+">Number of <strong style='text-transform: uppercase'>"+d+"</strong> nodes: <span class='badge'>"+i+"</span></li>",f.push([""+k,i]);j+=l}return g="<li id='node-stats-graph' class='list-group-item'></li>",j+=g,b.dash.select("#node-stats").html(j),this.insertSVG("node",f)},edgeStats:function(){var a,c,d,e,f,g,h,i,j,k,l,m,n;if(e=[],c=b.get.allEdges().length,a=b.get.activeEdges().length,l=c-a,i="<li class = 'list-group-item gen_edge
_stat'>Number of relationships: <span class='badge'>"+c+"</span></li> <li class = 'list-group-item gen_edge_stat'>Number of active relationships: <span class='badge'>"+a+"</span></li> <li class = 'list-group-item gen_edge_stat'>Number of inactive relationships: <span class='badge'>"+l+"</span></li></br>",b.conf.edgeTypes){for(g=_.values(alchemy.conf.edgeTypes)[0],k="",m=0,n=g.length;n>m;m++)j=g[m],j&&(d=j.replace("_"," "),h=_.filter(b.get.allEdges(),function(a){return a._edgeType===j?a:void 0}).length,k+="<li class = 'list-group-item edgeType' id='li-"+j+"' name = "+d+">Number of <strong style='text-transform: uppercase'>"+d+"</strong> relationships: <span class='badge'>"+h+"</span></li>",e.push([""+d,h]));i+=k}return f="<li id='node-stats-graph' class='list-group-item'></li>",i+=f,b.dash.select("#rel-stats").html(i),this.insertSVG("edge",e)},insertSVG:function(a,c){var d,e,f,g,h,i,j,k;return null===c?b.dash.select("#"+a+"-stats-graph").html("<br><h4 class='no-data'>There are no "+a
+"Types listed in your conf.</h4>"):(k=.25*b.conf.graphWidth(),g=250,i=k/4,f=d3.scale.category20(),d=d3.svg.arc().outerRadius(i-10).innerRadius(i/2),h=d3.layout.pie().sort(null).value(function(a){return a[1]}),j=b.dash.select("#"+a+"-stats-graph").append("svg").append("g").style({width:k,height:g}).attr("transform","translate("+k/2+","+g/2+")"),e=j.selectAll(".arc").data(h(c)).enter().append("g").classed("arc",!0).on("mouseover",function(a,d){return b.dash.select("#"+c[d][0]+"-stat").classed("hidden",!1)}).on("mouseout",function(a,d){return b.dash.select("#"+c[d][0]+"-stat").classed("hidden",!0)}),e.append("path").attr("d",d).attr("stroke",function(a,b){return f(b)}).attr("stroke-width",2).attr("fill-opacity","0.3"),e.append("text").attr("transform",function(a){return"translate("+d.centroid(a)+")"}).attr("id",function(a,b){return""+c[b][0]+"-stat"}).attr("dy",".35em").classed("hidden",!0).text(function(a,b){return c[b][0]}))},update:function(){return b.conf.nodeStats&&this.nodeStats
(),b.conf.edgeStats?this.edgeStats():void 0}}},a.prototype.updateGraph=function(a){var b;return b=a,function(){for(b.generateLayout(),b._drawEdges.createEdge(b.elements.edges.d3),b._drawNodes.createNode(b.elements.nodes.d3),b.layout.positionRootNodes(),b.force.start();b.force.alpha()>.005;)b.force.tick();
+return b.force.on("tick",b.layout.tick).start(),b.elements.nodes.svg.attr("transform",function(a){return"translate("+a.x+", "+a.y+")"})}},a.prototype.defaults={plugins:null,renderer:"svg",graphWidth:function(){return d3.select(this.divSelector).node().parentElement.clientWidth},graphHeight:function(){return"BODY"===d3.select(this.divSelector).node().parentElement.nodeName?window.innerHeight:d3.select(this.divSelector).node().parentElement.clientHeight},alpha:.5,collisionDetection:!0,nodeOverlap:25,fixNodes:!1,fixRootNodes:!1,forceLocked:!0,linkDistancefn:"default",nodePositions:null,showEditor:!1,captionToggle:!1,toggleRootNodes:!1,removeElement:!1,cluster:!1,clusterKey:"cluster",clusterColours:d3.shuffle(["#DD79FF","#FFFC00","#00FF30","#5168FF","#00C0FF","#FF004B","#00CDCD","#f83f00","#f800df","#ff8d8f","#ffcd00","#184fff","#ff7e00"]),clusterControl:!1,nodeStats:!1,edgeStats:!1,edgeFilters:!1,nodeFilters:!1,edgesToggle:!1,nodesToggle:!1,zoomControls:!1,nodeCaption:"caption",nodeCap
tionsOnByDefault:!1,nodeStyle:{all:{radius:10,color:"#68B9FE",borderColor:"#127DC1",borderWidth:function(a,b){return b/3},captionColor:"#FFFFFF",captionBackground:null,captionSize:12,selected:{color:"#FFFFFF",borderColor:"#349FE3"},highlighted:{color:"#EEEEFF"},hidden:{color:"none",borderColor:"none"}}},nodeColour:null,nodeMouseOver:"caption",nodeRadius:10,nodeTypes:null,rootNodes:"root",rootNodeRadius:15,nodeClick:null,edgeCaption:"caption",edgeCaptionsOnByDefault:!1,edgeStyle:{all:{width:4,color:"#CCC",opacity:.2,directed:!0,curved:!0,selected:{opacity:1},highlighted:{opacity:1},hidden:{opacity:0}}},edgeTypes:null,curvedEdges:!1,edgeWidth:function(){return 4},edgeOverlayWidth:20,directedEdges:!1,edgeArrowSize:5,edgeClick:null,search:!1,searchMethod:"contains",backgroundColour:"#000000",theme:null,afterLoad:"afterLoad",divSelector:"#alchemy",dataSource:null,initialScale:1,initialTranslate:[0,0],scaleExtent:[.5,2.4],exportSVG:!1,dataWarning:"default",warningMessage:"There be no data
! What's going on?"},c=function(a){return{a:a,createLink:function(a){var b;return b=this.a.conf,a.append("path").attr("class","edge-line").attr("id",function(a){return"path-"+a.id}),a.filter(function(a){return null!=a.caption}).append("text"),a.append("path").attr("class","edge-handler").style("stroke-width",""+b.edgeOverlayWidth).style("opacity","0")},styleLink:function(a){var b,c,d;return b=this.a,c=this.a.conf,d=this.a.drawing.EdgeUtils,a.each(function(a){var b,e,f,g,h,i,j,k,l;return f=d.edgeWalk(a),e=c.curvedEdges?30:0,b=e/10,k=a.source.radius+a["stroke-width"]/2,l=e/10,j=f.edgeLength/2,g=f.edgeLength-(a.target.radius-a.target["stroke-width"]/2),h=e/10,i=d3.select(this),i.style(d.edgeStyle(a)),i.attr("transform","translate("+a.source.x+", "+a.source.y+") rotate("+f.edgeAngle+")"),i.select(".edge-line").attr("d",function(){var d,f,i;return f="M"+k+","+l+"q"+j+","+e+" "+g+","+h,c.directedEdges?(i=2*a["stroke-width"],d="l"+-i+","+(i+b)+" l"+i+","+(-i-b)+" l"+-i+","+(-i+b),f+d):f}(
)),i.select(".edge-handler").attr("d",function(){return i.select(".edge-line").attr("d")})})},classEdge:function(a){return a.classed("active",!0)},styleText:function(a){var b,c,d;return b=this.a.conf,c=b.curvedEdges,d=this.a.drawing.EdgeUtils,a.select("text").each(function(a){var c,e;return e=d.edgeWalk(a),c=e.edgeLength/2,d3.select(this).attr("dx",""+c).text(a.caption).attr("xlink:xlink:href","#path-"+a.source.id+"-"+a.target.id).style("display",function(){return b.edgeCaptionsOnByDefault?"block":void 0})})},setInteractions:function(a){var b;return b=this.a.interactions,a.select(".edge-handler").on("click",b.edgeClick).on("mouseover",function(a){return b.edgeMouseOver(a)}).on("mouseout",function(a){return b.edgeMouseOut(a)})}}},d=function(a){return{a:a,createEdge:function(a){var b,c;return b=this.a.drawing.DrawEdge,c=this.a.vis.selectAll("g.edge").data(a),c.enter().append("g").attr("id",function(a){return"edge-"+a.id+"-"+a.pos}).attr("class",function(a){return"edge "+a.edgeType}).a
ttr("source-target",function(a){return""+a.source.id+"-"+a.target.id}),b.createLink(c),b.classEdge(c),b.styleLink(c),b.styleText(c),b.setInteractions(c),c.exit().remove(),this.a.conf.directedEdges&&this.a.conf.curvedEdges?c.select(".edge-line").attr("marker-end","url(#arrow)"):void 0},updateEdge:function(a){var b,c;return b=this.a.drawing.DrawEdge,c=this.a.vis.select("#edge-"+a.id+"-"+a.pos),b.classEdge(c),b.styleLink(c),b.styleText(c),b.setInteractions(c)}}},e=function(a){return{a:a,styleText:function(a){var b,c,d;return b=this.a.conf,d=this.a.drawing.NodeUtils,c=this.a._nodes,a.selectAll("text").attr("dy",function(a){return c[a.id].getProperties().root?b.rootNodeRadius/2:2*b.nodeRadius-5}).attr("visibility",function(a){return"hidden"===c[a.id]._state?"hidden":"visible"}).text(function(a){return d.nodeText(a)}).style("display",function(){return b.nodeCaptionsOnByDefault?"block":void 0})},createNode:function(a){return a=_.difference(a,a.select("circle").data()),a.__proto__=d3.select
().__proto__,a.append("circle").attr("id",function(a){return"circle-"+a.id}),a.append("svg:text").attr("id",function(a){return"text-"+a.id})},styleNode:function(a){var b;return b=this.a.drawing.NodeUtils,a.selectAll("circle").attr("r",function(a){return"function"==typeof a.radius?a.radius():a.radius}).each(function(a){return d3.select(this).style(b.nodeStyle(a))})},setInteractions:function(a){var b,c,d,e,f,g,h;return b=this.a.conf,c=this.a.interactions,e="editor"===this.a.get.state("interactions"),d=d3.behavior.drag().origin(Object).on("dragstart",null).on("drag",null).on("dragend",null),e?(f=new this.a.editor.Interactions,a.on("mouseup",function(a){return f.nodeMouseUp(a)}).on("mouseover",function(a){return f.nodeMouseOver(a)}).on("mouseout",function(a){return f.nodeMouseOut(a)}).on("dblclick",function(a){return c.nodeDoubleClick(a)}).on("click",function(a){return f.nodeClick(a)})):(a.on("mouseup",null).on("mouseover",function(a){return c.nodeMouseOver(a)}).on("mouseout",function(a
){return c.nodeMouseOut(a)}).on("dblclick",function(a){return c.nodeDoubleClick(a)}).on("click",function(a){return c.nodeClick(a)}),d=d3.behavior.drag().origin(Object).on("dragstart",c.nodeDragStarted).on("drag",c.nodeDragged).on("dragend",c.nodeDragended),b.fixNodes||(g=a.filter(function(a){return a.root!==!0}),g.call(d)),b.fixRootNodes?void 0:(h=a.filter(function(a){return a.root===!0}),h.call(d)))}}},f=function(a){return{a:a,createNode:function(a){var b,c;return b=this.a.drawing.DrawNode,c=this.a.vis.selectAll("g.node").data(a,function(a){return a.id}),c.enter().append("g").attr("class",function(a){var b;return b=a.self._nodeType,"node "+b+" active"}).attr("id",function(a){return"node-"+a.id}).classed("root",function(a){return a.root}),b.createNode(c),b.styleNode(c),b.styleText(c),b.setInteractions(c),c.exit().remove()},updateNode:function(a){var b,c;return b=this.a.drawing.DrawNode,c=this.a.vis.select("#node-"+a.id),b.styleNode(c),b.styleText(c),b.setInteractions(c)}}},a.prototy
pe.EdgeUtils=function(a){return{a:a,edgeStyle:function(a){var b,c,d,e,f;return c=this.a.conf,d=this.a._edges[a.id][a.pos],f=this.a.svgStyles.edge.update(d),e=this.a._nodes,this.a.conf.cluster&&(b=this.a.layout._clustering,f.stroke=function(a){var d,f,g,h,i,j;return d=c.clusterKey,i=e[a.source.id]._properties,j=e[a.target.id]._properties,i.root||j.root?(h=i.root?j[d]:i[d],""+b.getClusterColour(h)):i[d]===j[d]?(h=i[d],""+b.getClusterColour(h)):i[d]!==j[d]?(g=""+i[d]+"-"+j[d],f="cluster-gradient-"+g,"url(#"+f+")"):void 0}(a)),f},triangle:function(a){var b,c,d;return d=a.target.x-a.source.x,b=a.target.y-a.source.y,c=Math.sqrt(b*b+d*d),[d,b,c]},edgeWalk:function(a){var b,c,d,e,f,g,h,i;return i=this.triangle(a),h=i[0],e=i[1],f=i[2],d=a["stroke-width"],b=2,g=a.source.radius+a.source["stroke-width"]-d/2+b,c=f-g-1.5*b,{edgeAngle:Math.atan2(e,h)/Math.PI*180,edgeLength:c}},middleLine:function(a){return this.curvedDirectedEdgeWalk(a,"middle")},startLine:function(a){return this.curvedDirectedEdg
eWalk(a,"linkStart")},endLine:function(a){return this.curvedDirectedEdgeWalk(a,"linkEnd")},edgeLength:function(a){var b,c,d;return d=a.target.x-a.source.x,b=a.target.y-a.source.y,c=Math.sqrt(b*b+d*d)},edgeAngle:function(a){var b,c;return c=a.target.x-a.source.x,b=a.target.y-a.source.y,Math.atan2(b,c)/Math.PI*180},captionAngle:function(a){return-90>a||a>90?180:0},middlePath:function(a){var b,c;return c=this.a.vis.select("#path-"+a.id).node(),b=c.getPointAtLength(c.getTotalLength()/2),{x:b.x,y:b.y}},middlePathCurve:function(a){var b,c;return c=d3.select("#path-"+a.id).node(),b=c.getPointAtLength(c.getTotalLength()/2),{x:b.x,y:b.y}}}},a.prototype.NodeUtils=function(a){var b;return b=a,{nodeStyle:function(a){var c,d;return c=b.conf,d=a.self,c.cluster&&"hidden"!==d._state&&(a.fill=function(){var a,e,f,g,h,i,j;return e=b.layout._clustering,j=d.getProperties(),a=e.clusterMap,i=c.clusterKey,h=c.clusterColours,g=a[j[i]]%h.length,f=h[g],""+f}(a),a.stroke=a.fill),a},nodeText:function(a){var c,
d,e;return d=b.conf,e=b._nodes[a.id]._properties,d.nodeCaption&&"string"==typeof d.nodeCaption?null!=e[d.nodeCaption]?e[d.nodeCaption]:"":d.nodeCaption&&"function"==typeof d.nodeCaption?(c=d.nodeCaption(e),(void 0===c||"undefined"===String(c))&&(b.log.caption="At least one caption returned undefined",d.caption=!1),c):void 0}}},a.prototype.svgStyles=function(a){return{a:a,node:{a:this.a,populate:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;return b=this.a.conf,d=_.omit(b.nodeStyle.all,"selected","highlighted","hidden"),c=a,m=function(a){return"function"==typeof a?a:function(){return a}},g=_.keys(b.nodeTypes)[0],f=a.getProperties()[g],void 0===b.nodeStyle[f]&&(f="all"),n=_.assign(_.cloneDeep(d),b.nodeStyle[f]),k=_.assign(n,b.nodeStyle[f][a._state]),h=m(k.radius),e=m(k.color),i=m(k.borderColor),j=m(k.borderWidth),l={},l.radius=h(c),l.fill=e(c),l.stroke=i(c),l["stroke-width"]=j(c,h(c)),l}},edge:{a:this.a,populate:function(a){var b,c,d,e,f,g,h,i,j,k;return c=this.a.conf,d=_.omit(c.edgeStyle
.all,"selected","highlighted","hidden"),i=function(a){return"function"==typeof a?a:function(){return a}},e=a._edgeType,void 0===c.edgeStyle[e]&&(e="all"),j=_.assign(_.cloneDeep(d),c.edgeStyle[e]),g=_.assign(j,c.edgeStyle[e][a._state]),k=i(g.width),b=i(g.color),f=i(g.opacity),h={stroke:b(a),"stroke-width":k(a),opacity:f(a),fill:"none"}},update:function(a){var b,c,d,e,f,g,h;return c=this.a.conf,e=a._style,g=function(a){return"function"==typeof a?a:function(){return a}},h=g(e.width),b=g(e.color),d=g(e.opacity),f={stroke:b(a),"stroke-width":h(a),opacity:d(a),fill:"none"}}}}},g=function(){function a(){this.nodeEditor=n(this.nodeEditor,this),this.startEditor=n(this.startEditor,this),this.utils=new alchemy.editor.Utils}return a.prototype.editorContainerHTML='<div id="editor-header" data-toggle="collapse" data-target="#editor #element-options">\n <h3>Editor</h3><span class="fa fa-2x fa-caret-right"></span>\n</div>\n<div id="element-options" class="collapse">\n <ul class="list-group">
\n <li class="list-group-item" id="remove">Remove Selected</li> \n <li class="list-group-item" id="editor-interactions">Editor mode enabled, click to disable editor interactions</li>\n </ul>\n</div>',a.prototype.elementEditorHTML=function(a){return"<h4>"+a+' Editor</h4>\n<form id="add-property-form">\n <div id="add-property">\n <input class="form-control" id="add-prop-key" placeholder="New Property Name">\n <input class="form-control" id="add-prop-value" placeholder="New Property Value">\n </div>\n <input id="add-prop-submit" type="submit" value="Add Property" placeholder="add a property to this node">\n</form>\n<form id="properties-list">\n <input id="update-properties" type="submit" value="Update Properties">\n</form>'},a.prototype.startEditor=function(){var a,b,c,d,e;return a=alchemy.conf.divSelector,d=this.editorContainerHTML,b=alchemy.dash.select("#control-dash").append("div").attr("id","editor").html(d),b.select("#editor-header").on("
click",function(){return alchemy.dash.select("#element-options").classed("in")?alchemy.dash.select("#editor-header>span").attr("class","fa fa-2x fa-caret-right"):alchemy.dash.select("#editor-header>span").attr("class","fa fa-2x fa-caret-down")}),c=b.select("#element-options ul #editor-interactions").on("click",function(){return d3.select(this).attr("class",function(){return"editor"===alchemy.get.state()?(alchemy.set.state("interactions","default"),"inactive list-group-item"):(alchemy.set.state("interactions","editor"),"active list-group-item")}).html(function(){return"editor"===alchemy.get.state()?"Disable Editor Interactions":"Enable Editor Interactions"})}),b.select("#element-options ul #remove").on("click",function(){return alchemy.editor.remove()}),e=this.utils,c.on("click",function(){return alchemy.dash.select("#editor-interactions").classed("active")?(e.disableEditor(),alchemy.dash.select("#editor-interactions").classed({active:!1,inactive:!0}).html("Editor mode disabled, clic
k to enable editor interactions")):(e.enableEditor(),alchemy.dash.select("#editor-interactions").classed({active:!0,inactive:!1}).html("Editor mode enabled, click to disable editor interactions"))})},a.prototype.nodeEditor=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;c=alchemy.conf.divSelector,d=alchemy.dash.select("#control-dash #editor"),i=d.select("#element-options"),f=this.elementEditorHTML("Node"),e=i.append("div").attr("id","node-editor").html(f),e.attr("class",function(){var a;return a=alchemy.dash.select("#editor-interactions").classed("active"),a?"enabled":"hidden"}),b=d.select("#node-editor form #add-property"),b.select("#node-add-prop-key").attr("placeholder","New Property Name").attr("value",null),b.select("#node-add-prop-value").attr("placeholder","New Property Value").attr("value",null),alchemy.dash.select("#add-property-form").on("submit",function(){var a,b;return event.preventDefault(),a=alchemy.dash.select("#add-prop-key").property("value"),a=a.replace(/\s/g,"_"),b=alche
my.dash.select("#add-prop-value").property("value"),l(a,b,!0),alchemy.dash.selectAll("#add-property .edited-property").classed({"edited-property":!1}),this.reset()}),g=alchemy._nodes[a.id].getProperties(),alchemy.vis.select("#node-"+a.id).classed({editing:!0}),k=d.select("#node-editor #properties-list");for(j in g)m=g[j],h=k.append("div").attr("id","node-"+j).attr("class","property form-inline form-group"),h.append("label").attr("for","node-"+j+"-input").attr("class","form-control property-name").text(""+j),h.append("input").attr("id","node-"+j+"-input").attr("class","form-control property-value").attr("value",""+m);return alchemy.dash.select("#properties-list").on("submit",function(){var a,b,c,d,e,f,g;for(event.preventDefault(),b=alchemy.dash.selectAll(".edited-property"),g=b[0],e=0,f=g.length;f>e;e++)j=g[e],c=alchemy.dash.select(j),a=c.select("label").text(),d=c.select("input").attr("value"),l(a,d,!1);return alchemy.dash.selectAll("#node-properties-list .edited-property").classed(
{"edited-property":!1}),this.reset()}),d3.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown",function(){return 13===d3.event.keyCode&&event.preventDefault(),d3.select(this).classed({"edited-property":!0})}),l=function(b,c,d){var e,f;return f=a.id,""!==b&&""!==c?(alchemy._nodes[f].setProperty(""+b,""+c),e=alchemy._drawNodes,e.updateNode(alchemy.viz.select("#node-"+f)),d===!0?(alchemy.dash.select("#node-add-prop-key").attr("value","property added/updated to key: "+b),alchemy.dash.select("#node-add-prop-value").attr("value","property at "+b+" updated to: "+c)):alchemy.dash.select("#node-"+b+"-input").attr("value","property at "+b+" updated to: "+c)):d===!0?(alchemy.dash.select("#node-add-prop-key").attr("value","null or invalid input"),alchemy.dash.select("#node-add-prop-value").attr("value","null or invlid input")):alchemy.dash.select("#node-"+b+"-input").attr("value","null or invalid input")}},a.prototype.editorClear=function(){return alchemy.dash.selectAll(".node").
classed({editing:!1}),alchemy.dash.selectAll(".edge").classed({editing:!1}),alchemy.dash.select("#node-editor").remove(),alchemy.dash.select("#edge-editor").remove(),alchemy.dash.select("#node-add-prop-submit").attr("placeholder",function(){return alchemy.vis.selectAll(".selected").empty()?"select a node or edge to edit properties":"add a property to this element"})},a.prototype.edgeEditor=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;c=alchemy.conf.divSelector,f=alchemy.dash("#control-dash #editor"),i=f.select("#element-options"),h=this.elementEditorHTML("Edge"),g=i.append("div").attr("id","edge-editor").html(h),g.attr("class",function(){return alchemy.dash.select("#editor-interactions").classed("active")?"enabled":"hidden"}),b=f.select("#edge-editor form #add-property"),b.select("#add-prop-key").attr("placeholder","New Property Name").attr("value",null),b.select("#add-prop-value").attr("placeholder","New Property Value").attr("value",null),d=alchemy._edges[a.id].getProperties(),alchemy.
vis.select("#edge-"+a.id).classed({editing:!0}),k=f.select("#edge-editor #properties-list");for(j in d)m=d[j],e=k.append("div").attr("id","edge-"+j).attr("class","property form-inline form-group"),e.append("label").attr("for","edge-"+j+"-input").attr("class","form-control property-name").text(""+j),e.append("input").attr("id","edge-"+j+"-input").attr("class","form-control property-value").attr("value",""+m);return alchemy.dash.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown",function(){return 13===d3.event.keyCode&&event.preventDefault(),d3.select(this).classed({"edited-property":!0})}),alchemy.dash.select("#add-property-form").on("submit",function(){var a,b;return event.preventDefault(),a=alchemy.dash.select("#add-prop-key").property("value"),a=a.replace(/\s/g,"_"),b=alchemy.dash.select("#add-prop-value").property("value"),l(a,b,!0),alchemy.dash.selectAll("#add-property .edited-property").classed({"edited-property":!1}),this.reset()}),d3.select("#properties-list"
).on("submit",function(){var a,b,c,d,e,f,g;for(event.preventDefault(),b=alchemy.dash.selectAll(".edited-property"),g=b[0],e=0,f=g.length;f>e;e++)j=g[e],c=alchemy.dash.select(j),a=c.select("label").text(),d=c.select("input").property("value"),l(a,d,!1);return alchemy.dash.selectAll("#properties-list .edited-property").classed({"edited-property":!1}),this.reset()}),l=function(b,c,d){var e,f,g;return f=a.id,""!==b&&""!==c?(alchemy._edges[f].setProperty(""+b,""+c),g=alchemy.vis.select("#edge-"+f),e=new alchemy.drawing.DrawEdges,e.updateEdge(alchemy.vis.select("#edge-"+f)),d===!0?(alchemy.dash.select("#add-prop-key").attr("value","property added/updated to key: "+b),alchemy.dash.select("#add-prop-value").attr("value","property at "+b+" updated to: "+c)):alchemy.dash.select("#edge-"+b+"-input").attr("value","property at "+b+" updated to: "+c)):d===!0?(alchemy.dash.select("#add-prop-key").attr("value","null or invalid input"),alchemy.dash.select("#add-prop-value").attr("value","null or inv
lid input")):alchemy.dash.select("#edge-"+b+"-input").attr("value","null or invalid input")}},a}(),h=function(){function a(){this.reset=n(this.reset,this),this.deleteSelected=n(this.deleteSelected,this),this.addNodeDragended=n(this.addNodeDragended,this),this.addNodeDragging=n(this.addNodeDragging,this),this.addNodeStart=n(this.addNodeStart,this),this.edgeClick=n(this.edgeClick,this),this.nodeClick=n(this.nodeClick,this),this.nodeMouseUp=n(this.nodeMouseUp,this),this.editor=new alchemy.editor.Editor}return a.prototype.nodeMouseOver=function(){var a;return d3.select(this).select("circle").empty()||(a=d3.select(this).select("circle").attr("r"),d3.select(this).select("circle").attr("r",3*a)),this},a.prototype.nodeMouseUp=function(a){return this.sourceNode!==a?(this.mouseUpNode=!0,this.targetNode=a,this.click=!1):this.click=!0,this},a.prototype.nodeMouseOut=function(){var a;return d3.select(this).select("circle").empty()||(a=d3.select(this).select("circle").attr("r"),d3.select(this).sel
ect("circle").attr("r",a/3)),this},a.prototype.nodeClick=function(a){var b;return d3.event.stopPropagation(),alchemy.vis.select("#node-"+a.id).empty()||(b=alchemy.vis.select("#node-"+a.id).classed("selected"),alchemy.vis.select("#node-"+a.id).classed("selected",!b)),this.editor.editorClear(),this.editor.nodeEditor(a)},a.prototype.edgeClick=function(a){return d3.event.stopPropagation(),this.editor.editorClear(),this.editor.edgeEditor(a)},a.prototype.addNodeStart=function(a){return d3.event.sourceEvent.stopPropagation(),this.sourceNode=a,alchemy.vis.select("#dragline").classed({hidden:!1}),this},a.prototype.addNodeDragging=function(){var a,b;return a=d3.event.x,b=d3.event.y,alchemy.vis.select("#dragline").attr("x1",this.sourceNode.x).attr("y1",this.sourceNode.y).attr("x2",a).attr("y2",b).attr("style","stroke: #FFF"),this},a.prototype.addNodeDragended=function(){var a,b,c;return this.click||(this.mouseUpNode||(a=alchemy.vis.select("#dragline"),b=a.attr("x2"),c=a.attr("y2"),this.targetN
ode={id:""+_.uniqueId("addedNode_"),x:parseFloat(b),y:parseFloat(c),caption:"node added"}),this.newEdge={id:""+this.sourceNode.id+"-"+this.targetNode.id,source:this.sourceNode.id,target:this.targetNode.id,caption:"edited"},alchemy.editor.update(this.targetNode,this.newEdge)),this.reset(),this},a.prototype.deleteSelected=function(){switch(d3.event.keyCode){case 8:case 46:if("INPUT"!==d3.select(d3.event.target).node().tagName)return d3.event.preventDefault(),alchemy.editor.remove()}},a.prototype.reset=function(){return this.mouseUpNode=null,this.sourceNode=null,this.targetNode=null,this.newEdge=null,this.click=null,alchemy.vis.select("#dragline").classed({hidden:!0}).attr("x1",0).attr("y1",0).attr("x2",0).attr("y2",0),this},a}(),i=function(){function a(){this.enableEditor=n(this.enableEditor,this),this.drawNodes=alchemy._drawNodes,this.drawEdges=alchemy._drawEdges}return a.prototype.enableEditor=function(){var a,b,c;return alchemy.set.state("interactions","editor"),a=alchemy.vis.appen
d("line").attr("id","dragline"),this.drawNodes.updateNode(alchemy.node),this.drawEdges.updateEdge(alchemy.edge),c=alchemy.vis.selectAll(".selected"),b=new alchemy.editor.Editor,c.empty()||1!==c.length?c.classed({selected:!1}):c.classed("node")?(b.nodeEditor(c.datum()),alchemy.dash.select("#node-editor").attr("class","enabled").style("opacity",1)):c.classed("edge")?(b.edgeEditor(c.datum()),alchemy.dash.select("#edge-editor").attr("class","enabled").style("opacity",1)):void 0},a.prototype.disableEditor=function(){return alchemy.setState("interactions","default"),alchemy.vis.select("#dragline").remove(),alchemy.dash.select("#node-editor").transition().duration(300).style("opacity",0),alchemy.dash.select("#node-editor").transition().delay(300).attr("class","hidden"),this.drawNodes.updateNode(alchemy.node),alchemy.vis.selectAll(".node").classed({selected:!1})},a.prototype.remove=function(){var a,b,c,d,e,f,g,h,i,j,k,l;for(e=alchemy.vis.selectAll(".selected.node"),j=e[0],l=[],f=0,h=j.lengt
h;h>f;f++)if(b=j[f],c=alchemy.vis.select(b).data()[0].id,d=alchemy._nodes[c],null!=d){for(k=d.adjacentEdges,g=0,i=k.length;i>g;g++)a=k[g],alchemy._edges=_.omit(alchemy._edges,""+a.id+"-"+a._index),alchemy.edge=alchemy.edge.data(_.map(alchemy._edges,function(a){return a._d3}),function(a){return a.id}),alchemy.vis.select("#edge-"+a.id+"-"+a._index).remove();alchemy._nodes=_.omit(alchemy._nodes,""+c),alchemy.node=alchemy.node.data(_.map(alchemy._nodes,function(a){return a._d3}),function(a){return a.id}),alchemy.vis.select(b).remove(),l.push("editor"===alchemy.get.state("interactions")?alchemy.modifyElements.nodeEditorClear():void 0)}else l.push(void 0);return l},a.prototype.addNode=function(a){var b;return b=alchemy._nodes[a.id]=new alchemy.models.Node({id:""+a.id}),b.setProperty("caption",a.caption),b.setD3Property("x",a.x),b.setD3Property("y",a.y),alchemy.node=alchemy.node.data(_.map(alchemy._nodes,function(a){return a._d3}),function(a){return a.id})},a.prototype.addEdge=function(a){
var b;return b=alchemy._edges[a.id]=new alchemy.models.Edge(a),alchemy.edge=alchemy.edge.data(_.map(alchemy._edges,function(a){return a._d3}),function(a){return a.id})},a.prototype.update=function(a,b){return this.mouseUpNode?(alchemy.editor.addEdge(b),this.drawEdges.createEdge(alchemy.edge)):(alchemy.editor.addNode(a),alchemy.editor.addEdge(b),this.drawEdges.createEdge(alchemy.edge),this.drawNodes.createNode(alchemy.node)),alchemy.layout.tick()},a}(),a.prototype.Edge=function(a){var b;return b=function(){function b(b,c){var d;null==c&&(c=null),this.allNodesActive=n(this.allNodesActive,this),this.setProperties=n(this.setProperties,this),this.getStyles=n(this.getStyles,this),this.setProperties=n(this.setProperties,this),this.getProperties=n(this.getProperties,this),this._setID=n(this._setID,this),this._setD3Properties=n(this._setD3Properties,this),this.a=a,d=this.a.conf,this.id=this._setID(b),this._index=c,this._state="active",this._properties=b,this._edgeType=this._setEdgeType(),thi
s._style=null!=d.edgeStyle[this._edgeType]?_.merge(_.clone(d.edgeStyle.all),d.edgeStyle[this._edgeType]):_.clone(d.edgeStyle.all),this._d3=_.merge({id:this.id,pos:this._index,edgeType:this._edgeType,source:this.a._nodes[this._properties.source]._d3,target:this.a._nodes[this._properties.target]._d3,self:this},this.a.svgStyles.edge.populate(this)),this._setCaption(b,d),this.a._nodes[""+b.source]._addEdge(this),this.a._nodes[""+b.target]._addEdge(this)}return b.prototype._setD3Properties=function(a){return _.merge(this._d3,a)},b.prototype._setID=function(a){return null!=a.id?a.id:""+a.source+"-"+a.target},b.prototype._setCaption=function(a,b){var c,d;return c=b.edgeCaption,d=function(a){switch(typeof c){case"string":return a[c];case"function":return c(a)}}(a),d?this._d3.caption=d:void 0},b.prototype._setEdgeType=function(){var a,b,c;return a=this.a.conf,a.edgeTypes&&(_.isPlainObject(a.edgeTypes)?(c=Object.keys(this.a.conf.edgeTypes),b=this._properties[c]):_.isArray(a.edgeTypes)?b=this.
_properties.caption:"string"==typeof a.edgeTypes&&(b=this._properties[a.edgeTypes])),void 0===b&&(b="all"),this._setD3Properties("edgeType",b),b},b.prototype.getProperties=function(){var a,b,c;return a=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],null==a&&(a=null),null==a&&0===b.length?this._properties:0!==b.length?(c=_.union([a],b),_.pick(this._properties,c)):this._properties[a]},b.prototype.setProperties=function(a,b){return null==b&&(b=null),_.isPlainObject(a)?(_.assign(this._properties,a),"source"in a&&this._setD3Properties({source:alchemy._nodes[a.source]._d3}),"target"in a&&this._setD3Properties({target:alchemy._nodes[a.target]._d3})):(this._properties[a]=b,("source"===a||"target"===a)&&this._setD3Properties({property:alchemy._nodes[b]._d3})),this},b.prototype.getStyles=function(){var a,b,c;return b=arguments[0],c=2<=arguments.length?m.call(arguments,1):[],a=this,void 0===b?a._style:_.map(arguments,function(b){return a._style[b]})},b.prototype.setProperties=functi
on(a,b){return null==b&&(b=null),_.isPlainObject(a)?(_.assign(this._properties,a),"source"in a&&this._setD3Properties({source:this.a._nodes[a.source]._d3}),"target"in a&&this._setD3Properties({target:this.a._nodes[a.target]._d3})):(this._properties[a]=b,("source"===a||"target"===a)&&this._setD3Properties({property:this.a._nodes[b]._d3})),this},b.prototype.setStyles=function(a,b){return null==b&&(b=null),void 0===a&&(a=this.a.svgStyles.edge.populate(this)),_.isPlainObject(a)?_.assign(this._style,a):"string"==typeof a&&(this._style[a]=b),this._setD3Properties(this.a.svgStyles.edge.update(this)),this.a._drawEdges.updateEdge(this._d3),this},b.prototype.toggleHidden=function(){return this._state="hidden"===this._state?"active":"hidden",this.setStyles()},b.prototype.allNodesActive=function(){var a,b,c,d;return a=this._properties.source,c=this._properties.target,b=alchemy.get.nodes(a)[0],d=alchemy.get.nodes(c)[0],"active"===b._state&&"active"===d._state},b.prototype.remove=function(){var a
,b;return a=this,delete this.a._edges[a.id],null!=this.a._nodes[a._properties.source]&&_.remove(this.a._nodes[a._properties.source]._adjacentEdges,function(b){return b.id===a.id?b:void 0}),null!=this.a._nodes[a._properties.target]&&_.remove(this.a._nodes[a._properties.target]._adjacentEdges,function(b){return b.id===a.id?b:void 0}),this.a.vis.select("#edge-"+a.id+"-"+a._index).remove(),b=_.filter(this.a.force.links(),function(b){return b.id!==a.id?b:void 0}),this.a.force.links(b)},b}()},a.prototype.Node=function(a){var b;return b=function(){function b(b){this.getStyles=n(this.getStyles,this),this.setProperty=n(this.setProperty,this),this.getProperties=n(this.getProperties,this),this._setD3Properties=n(this._setD3Properties,this),this._setNodeType=n(this._setNodeType,this);var c;this.a=a,c=this.a.conf,this.id=b.id,this._properties=b,this._d3=_.merge({id:this.id,root:this._properties[c.rootNodes],self:this},this.a.svgStyles.node.populate(this)),this._nodeType=this._setNodeType(),this.
_style=c.nodeStyle[this._nodeType]?c.nodeStyle[this._nodeType]:c.nodeStyle.all,this._state="active",this._adjacentEdges=[]}return b.prototype._setNodeType=function(){var a,b,c,d;return a=this.a.conf,a.nodeTypes&&(_.isPlainObject(a.nodeTypes)?(b=Object.keys(this.a.conf.nodeTypes),d=_.values(a.nodeTypes),c=this._properties[b]):"string"==typeof a.nodeTypes&&(c=this._properties[a.nodeTypes])),void 0===c&&(c="all"),this._setD3Properties("nodeType",c),c},b.prototype._setD3Properties=function(a){return _.merge(this._d3,a)},b.prototype._addEdge=function(a){return this._adjacentEdges=_.union(this._adjacentEdges,[a])},b.prototype.getProperties=function(){var a,b,c;return a=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],null==a&&(a=null),null==a&&0===b.length?this._properties:0!==b.length?(c=_.union([a],b),_.pick(this._properties,c)):this._properties[a]},b.prototype.setProperty=function(a,b){return null==b&&(b=null),_.isPlainObject(a)?_.assign(this._properties,a):this._properties[a]
=b,this},b.prototype.removeProperty=function(){var a,b,c,d,e;for(c=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],d=0,e=arguments.length;e>d;d++)a=arguments[d],delete this._properties[a];return this},b.prototype.getStyles=function(){var a,b,c;return a=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],c=this,void 0===a?c._style:_.map(arguments,function(a){return c._style[a]})},b.prototype.setStyles=function(a,b){return null==b&&(b=null),void 0===a?a=this.a.svgStyles.node.populate(this):_.isPlainObject(a)?_.assign(this._style,a):this._style[a]=b,this._setD3Properties(this.a.svgStyles.node.populate(this)),this.a._drawNodes.updateNode(this._d3),this},b.prototype.toggleHidden=function(){var a;return a=this.a,this._state="hidden"===this._state?"active":"hidden",this.setStyles(),_.each(this._adjacentEdges,function(b){var c,d,e,f,g;return g=b.id.split("-"),c=g[0],e=g[1],d=a._nodes[""+c]._state,f=a._nodes[""+e]._state,"hidden"===b._state&&"active"===d&&"active"===f?b.toggl
eHidden():"active"!==b._state||"hidden"!==d&&"hidden"!==f?void 0:b.toggleHidden()})},b.prototype.outDegree=function(){return this._adjacentEdges.length},b.prototype.remove=function(){for(;!_.isEmpty(this._adjacentEdges);)this._adjacentEdges[0].remove();return delete this.a._nodes[this.id],this.a.vis.select("#node-"+this.id).remove()},b}()},a.prototype.plugins=function(b){return{init:function(){return _.each(_.keys(b.conf.plugins),function(c){return b.plugins[c]=a.prototype.plugins[c](b),null!=b.plugins[c].init?b.plugins[c].init():void 0})}}},a.prototype.themes={"default":{backgroundColour:"#000000",nodeStyle:{all:{radius:function(){return 10},color:function(){return"#68B9FE"},borderColor:function(){return"#127DC1"},borderWidth:function(a,b){return b/3},captionColor:function(){return"#FFFFFF"},captionBackground:function(){return null},captionSize:12,selected:{color:function(){return"#FFFFFF"},borderColor:function(){return"#349FE3"}},highlighted:{color:function(){return"#EEEEFF"}},hid
den:{color:function(){return"none"},borderColor:function(){return"none"}}}},edgeStyle:{all:{width:4,color:"#CCC",opacity:.2,directed:!0,curved:!0,selected:{opacity:1},highlighted:{opacity:1},hidden:{opacity:0}}}},white:{theme:"white",backgroundColour:"#FFFFFF",nodeStyle:{all:{radius:function(){return 10
+},color:function(){return"#68B9FE"},borderColor:function(){return"#127DC1"},borderWidth:function(a,b){return b/3},captionColor:function(){return"#FFFFFF"},captionBackground:function(){return null},captionSize:12,selected:{color:function(){return"#FFFFFF"},borderColor:function(){return"38DD38"}},highlighted:{color:function(){return"#EEEEFF"}},hidden:{color:function(){return"none"},borderColor:function(){return"none"}}}},edgeStyle:{all:{width:4,color:"#333",opacity:.4,directed:!1,curved:!1,selected:{color:"#38DD38",opacity:.9},highlighted:{color:"#383838",opacity:.7},hidden:{opacity:0}}}}},a.prototype.exports=function(a){var b;return b=a,{init:function(){return b.exports.show()},show:function(){return b.dash.select("#all-exports").append("li").attr({"class":"list-group-item active-label toggle"}).html("SVG").on("click",function(){var a,c,d,e,f;return d=d3.select(""+b.conf.divSelector+" svg").node(),c=(new XMLSerializer).serializeToString(d),e="data:image/svg+xml;utf8,"+c,a=e.replace("
xlink:",""),f=window.open(a),f.focus()})}}},l=function(){function a(a){this.dataWarning=n(this.dataWarning,this),this.a=a}return a.prototype.dataWarning=function(){return this.a.conf.dataWarning&&"function"==typeof this.a.conf.dataWarning?this.a.conf.dataWarning():"default"===this.a.conf.dataWarning?console.log("No dataSource was loaded"):void 0},a.prototype.divWarning=function(){return"create an element that matches the value for 'divSelector' in your conf.\nFor instance, if you are using the default 'divSelector' conf, simply provide\n<div id='#alchemy'></div>."},a}()}).call(this);
\ No newline at end of file
[06/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
new file mode 100644
index 0000000..020377d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.FieldValue;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
+
+
+public class DebugObjectView extends AbstractObjectProcessor {
+
+ @Override
+ public void process(final Request request, final ObjectAdapter object) {
+ final String classString = " class=\"" + request.getOptionalProperty(CLASS, "form debug") + "\"";
+ final String objectLink = request.getOptionalProperty(OBJECT + "-" + LINK_VIEW, request.getViewPath());
+ // final String collectionLink = request.getOptionalProperty(COLLECTION + "-" + LINK_VIEW, request.getViewPath());
+ final String oddRowClass = request.getOptionalProperty(ODD_ROW_CLASS);
+ final String evenRowClass = request.getOptionalProperty(EVEN_ROW_CLASS);
+ final boolean showIcons = request.isRequested(SHOW_ICON, true);
+
+ ObjectSpecification specification = object.getSpecification();
+
+ request.appendHtml("<div" + classString + ">");
+ request.appendHtml("<div class=\"title\">");
+ request.appendAsHtmlEncoded(specification.getSingularName() + " - " + specification.getFullIdentifier());
+ request.appendHtml("</div>");
+
+ Version version = object.getVersion();
+ request.appendHtml("<div class=\"version\">");
+ request.appendAsHtmlEncoded("#" + version.sequence() + " - " + version.getUser() + " (" + version.getTime() + ")" );
+ request.appendHtml("</div>");
+
+ final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.ALL);
+
+ int row = 1;
+ for (int i = 0; i < fields.size(); i++) {
+ final ObjectAssociation field = fields.get(i);
+ /*
+ * if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) { continue; }
+ */
+ String cls;
+ if (row++ % 2 == 1) {
+ cls = " class=\"field " + (oddRowClass == null ? ODD_ROW_CLASS : oddRowClass) + "\"";
+ } else {
+ cls = " class=\"field " + (evenRowClass == null ? EVEN_ROW_CLASS : evenRowClass) + "\"";
+ }
+ request.appendHtml("<div " + cls + "><span class=\"label\">");
+ request.appendAsHtmlEncoded(field.getName());
+ request.appendHtml(":</span>");
+
+ final boolean isNotParseable =
+ !fields.get(i).getSpecification().containsFacet(ParseableFacet.class);
+ LinkedObject linkedObject = null;
+ if (isNotParseable) {
+ // linkedObject = new LinkedObject(field.isOneToManyAssociation() ? collectionLink : objectLink);
+ linkedObject = new LinkedObject(objectLink);
+ }
+ addField(request, object, field, linkedObject, showIcons);
+
+ if (field.isOneToManyAssociation()) {
+ Collection collection = (Collection) field.get(object).getObject();
+ if (collection.size() == 0) {
+ request.appendHtml("[empty]");
+ } else {
+ // request.appendHtml(collection.size() + " elements");
+
+ request.appendHtml("<ol>");
+
+ for (Object element : collection) {
+ ObjectAdapter adapterFor = IsisContext.getPersistenceSession().getAdapterManager().getAdapterFor(element);
+ IsisContext.getPersistenceSession().resolveImmediately(adapterFor);
+
+ String id = request.getContext().mapObject(adapterFor, linkedObject.getScope(), Scope.INTERACTION);
+
+ request.appendHtml("<li class=\"element\">");
+ request.appendHtml("<a href=\"" + linkedObject.getForwardView() + "?" + linkedObject.getVariable() + "="
+ + id + request.getContext().encodedInteractionParameters() + "\">");
+ request.appendHtml(element.toString());
+ request.appendHtml("</a></li>");
+ }
+ request.appendHtml("</ol>");
+ }
+ } else {
+ FieldValue.write(request, object, field, linkedObject, "value", showIcons, 0);
+ }
+
+
+
+ request.appendHtml("</div>");
+ }
+ request.appendHtml("</div>");
+ }
+
+ protected void addField(
+ final Request request,
+ final ObjectAdapter object,
+ final ObjectAssociation field,
+ final LinkedObject linkedObject,
+ final boolean showIcons) {
+ }
+
+ @Override
+ public String getName() {
+ return "debug-object";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebuggerLink.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebuggerLink.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebuggerLink.java
new file mode 100644
index 0000000..795d272
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebuggerLink.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class DebuggerLink extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ if (request.getContext().isDebugDisabled()) {
+ request.skipUntilClose();
+ return;
+ }
+
+ final RequestContext context = request.getContext();
+ final Object result = context.getVariable(RequestContext.RESULT);
+ request.appendHtml("<div class=\"debug\">");
+ request.appendHtml("<a class=\"debug-link\" href=\"/debug/debug.shtml\" target=\"debug\" title=\"debug\" >...</a>");
+ if (result != null) {
+ request.appendHtml(" <a href=\"/debug/object.shtml?_result=" + result + "\" target=\"debug\" title=\"debug instance\">...</a>");
+ }
+ request.appendHtml(" <span class=\"debug-link\" onclick=\"$('#page-debug').toggle()\" alt=\"show/hide debug details\">...</span>");
+ request.appendHtml("</div>");
+
+ request.processUtilCloseTag();
+ }
+
+ @Override
+ public String getName() {
+ return "debugger";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Diagnostics.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Diagnostics.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Diagnostics.java
new file mode 100644
index 0000000..037812e
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Diagnostics.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.debug.DebugHtmlString;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Diagnostics extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ if (request.getContext().isDebugDisabled()) {
+ return;
+ }
+
+ final String type = request.getOptionalProperty(TYPE, "page");
+ final boolean isForced = request.isRequested("force");
+ if (isForced || request.getContext().showDebugData()) {
+ request.appendHtml("<div class=\"debug\">");
+ if ("page".equals(type)) {
+ request.appendHtml("<pre>");
+ final RequestContext context = request.getContext();
+ request.appendHtml("URI: " + context.getUri());
+ request.appendHtml("\n");
+ request.appendHtml("File: " + context.fullFilePath(context.getResourceFile()));
+ final String result = (String) request.getContext().getVariable(RequestContext.RESULT);
+ if (result != null) {
+ request.appendHtml("\n");
+ request.appendHtml("Object: " + result);
+ }
+ request.appendHtml("</pre>");
+ } else if ("session".equals(type)) {
+ request.appendHtml("<pre>");
+ final AuthenticationSession session = IsisContext.getAuthenticationSession();
+ request.appendHtml("Session: " + session.getUserName() + " " + session.getRoles());
+ request.appendHtml("</pre>");
+ } else if ("variables".equals(type)) {
+ final RequestContext context = request.getContext();
+ final DebugHtmlString debug = new DebugHtmlString();
+ debug.appendln("", "");
+ context.append(debug, "variables");
+ debug.close();
+ request.appendHtml(debug.toString());
+ } else if ("processing".equals(type)) {
+ request.appendHtml("<pre>");
+ request.appendHtml(request.getContext().getDebugTrace());
+ request.appendHtml("</pre>");
+ } else {
+ request.appendHtml("<i>No such type " + type + "</i>");
+ }
+ request.appendHtml("</div>");
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "diagnostics";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Log.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Log.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Log.java
new file mode 100644
index 0000000..92db889
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Log.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Log extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ String name = request.getRequiredProperty(NAME);
+ Logger logger = LoggerFactory.getLogger(name);
+
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String message = request.popBuffer();
+ logger.info(message);
+ }
+
+ @Override
+ public String getName() {
+ return "log";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/LogLevel.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/LogLevel.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/LogLevel.java
new file mode 100644
index 0000000..66e2d6d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/LogLevel.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class LogLevel extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+
+ String view = request.getOptionalProperty(VIEW, request.getViewPath());
+ view = request.getContext().fullFilePath(view);
+ final org.apache.log4j.Level level = org.apache.log4j.LogManager.getRootLogger().getLevel();
+ final boolean showSelector = request.isRequested(SHOW_SELECT, true);
+ if (showSelector) {
+ request.appendHtml("<form action=\"log.app\" type=\"post\" >");
+ request.appendHtml("<input type=\"hidden\" name=\"view\" value=\"" + view + "\" />");
+ request.appendHtml("<select name=\"level\">");
+ for (final org.apache.log4j.Level l : new org.apache.log4j.Level[] { org.apache.log4j.Level.OFF, org.apache.log4j.Level.FATAL, org.apache.log4j.Level.ERROR, org.apache.log4j.Level.WARN, org.apache.log4j.Level.INFO, org.apache.log4j.Level.DEBUG, org.apache.log4j.Level.TRACE }) {
+ final String settings = level + "\"" + (level == l ? " selected=\"selected\" " : "");
+ request.appendHtml("<option " + settings + ">" + l + "</option>");
+ }
+ request.appendHtml("<input type=\"submit\" value=\"Change Level\" />");
+ request.appendHtml("</select>");
+ request.appendHtml("</form>");
+ } else {
+ request.appendHtml(level.toString());
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "log-level";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
new file mode 100644
index 0000000..54ff196
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Members extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ public String getName() {
+ return "members";
+ }
+
+ @Override
+ public void process(final Request request) {
+ if (request.getContext().isDebugDisabled()) {
+ return;
+ }
+
+ final String id = request.getOptionalProperty(OBJECT);
+ final String fieldName = request.getOptionalProperty(FIELD);
+ request.appendHtml("<pre class=\"debug\">");
+ try {
+ ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+ ObjectAssociation field = null;
+ if (fieldName != null) {
+ field = object.getSpecification().getAssociation(fieldName);
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+ object = field.get(object);
+ }
+ request.processUtilCloseTag();
+
+ final ObjectSpecification specification = field == null ? object.getSpecification() : field.getSpecification();
+
+ request.appendHtml(specification.getSingularName() + " (" + specification.getFullIdentifier() + ") \n");
+ final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED);
+ for (final ObjectAssociation fld : fields) {
+ if (!fld.isAlwaysHidden()) {
+ request.appendHtml(" " + fld.getId() + " - '" + fld.getName() + "' -> " + fld.getSpecification().getSingularName() + (fld.isOneToManyAssociation() ? " (collection of)" : "") + "\n");
+ }
+ }
+ request.appendHtml(" --------------\n");
+ final List<ObjectAction> actions = specification.getObjectActions(
+ ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
+ ;
+ for (final ObjectAction action : actions) {
+ request.appendHtml(" " + action.getId() + " (");
+ boolean first = true;
+ for (final ObjectActionParameter parameter : action.getParameters()) {
+ if (!first) {
+ request.appendHtml(", ");
+ }
+ request.appendHtml(parameter.getSpecification().getSingularName());
+ first = false;
+ }
+ request.appendHtml(")" + " - '" + action.getName() + "'");
+ if (action.getSpecification() != null) {
+ request.appendHtml(" -> " + action.getSpecification().getSingularName() + ")");
+ }
+ request.appendHtml("\n");
+ }
+ } catch (final ScimpiException e) {
+ request.appendHtml("Debug failed: " + e.getMessage());
+ }
+ request.appendHtml("</pre>");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ShowDebug.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ShowDebug.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ShowDebug.java
new file mode 100644
index 0000000..895f9a6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ShowDebug.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class ShowDebug extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ if (request.getContext().isDebugDisabled()) {
+ request.skipUntilClose();
+ } else {
+ request.processUtilCloseTag();
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "show-debug";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Specification.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Specification.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Specification.java
new file mode 100644
index 0000000..0974fe4
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Specification.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+
+public class Specification extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final RequestContext context = request.getContext();
+ if (context.isDebugDisabled()) {
+ return;
+ }
+
+ if (request.isRequested("always") || context.getDebug() == RequestContext.Debug.ON) {
+ request.appendHtml("<div class=\"debug\">");
+ request.appendHtml("<pre>");
+
+ final String id = request.getOptionalProperty("object");
+ final ObjectAdapter object = context.getMappedObjectOrResult(id);
+ final ObjectSpecification specification = object.getSpecification();
+ String type = request.getOptionalProperty(TYPE, "details");
+
+ if (type.equals("graph")) {
+ specificationGraph(request, specification, null, new ArrayList<ObjectSpecification>(), 0);
+ } else if (type.equals("details")) {
+ specificationDetails(request, specification);
+ } else {
+ request.appendHtml("invalid type: " + type);
+ }
+
+ request.appendHtml("</pre>");
+ request.appendHtml("</div>");
+ }
+ }
+
+ private void specificationDetails(final Request request, final ObjectSpecification specification) {
+ renderName(request, specification);
+ final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED);
+ for (int i = 0; i < fields.size(); i++) {
+ request.appendHtml(" " + fields.get(i).getName() + " (" + fields.get(i).getSpecification().getSingularName()
+ + ") \n");
+ }
+ }
+
+ private void specificationGraph(
+ Request request,
+ ObjectSpecification specification,
+ String fieldName,
+ List<ObjectSpecification> processed,
+ int level) {
+ if (processed.contains(specification)) {
+ return;
+ }
+
+ request.appendHtml(StringExtensions.repeat(" ", level));
+ if (processed.contains(specification)) {
+ request.appendHtml("* ");
+ }
+ request.appendHtml(specification.getFullIdentifier());
+ if (fieldName != null) {
+ request.appendHtml(" (" + fieldName + ")");
+ }
+ request.appendHtml("\n");
+
+ if (processed.contains(specification)) {
+ return;
+ }
+ processed.add(specification);
+
+ final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED);
+ for (int i = 0; i < fields.size(); i++) {
+ ObjectSpecification fieldSpecification = fields.get(i).getSpecification();
+ if (fieldSpecification.isValue()) {
+ continue;
+ }
+ specificationGraph(request, fieldSpecification, fields.get(i).getName(), processed, level + 1);
+ }
+ }
+
+ private void renderName(final Request request, final ObjectSpecification specification) {
+ request.appendHtml(specification.getSingularName() + " (" + specification.getFullIdentifier() + ") \n");
+ }
+
+ @Override
+ public String getName() {
+ return "specification";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ThrowException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ThrowException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ThrowException.java
new file mode 100644
index 0000000..65af85e
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/ThrowException.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class ThrowException extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ if (request.getContext().isDebugDisabled()) {
+ return;
+ }
+
+ final String message = request.getOptionalProperty("message", "Exception throw for testing purposes");
+ throw new IsisException(message);
+ }
+
+ @Override
+ public String getName() {
+ return "debug-exception";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
new file mode 100644
index 0000000..e88f89a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedFieldsBlock;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
+
+public abstract class AbstractFormView extends AbstractObjectProcessor {
+
+ @Override
+ public String checkFieldType(final ObjectAssociation objectField) {
+ return objectField.isOneToOneAssociation() ? null : "is not an object";
+ }
+
+ @Override
+ public void process(final Request request, final ObjectAdapter object) {
+ final LinkedFieldsBlock tag = new LinkedFieldsBlock();
+
+ if (object != null) {
+ final String id = request.getOptionalProperty(ID, object.getSpecification().getShortIdentifier());
+ final String cls = request.getOptionalProperty(CLASS, "form");
+ final String classString = " id=\"" + id + "\" class=\"" + cls + "\"";
+ String title = request.getOptionalProperty(FORM_TITLE);
+ final String oddRowClass = request.getOptionalProperty(ODD_ROW_CLASS);
+ final String evenRowClass = request.getOptionalProperty(EVEN_ROW_CLASS);
+ final String labelDelimiter = request.getOptionalProperty(LABEL_DELIMITER, ":");
+ final boolean showIcons = request.isRequested(SHOW_ICON, showIconByDefault());
+ String linkAllView = request.getOptionalProperty(LINK_VIEW);
+
+ request.setBlockContent(tag);
+ request.processUtilCloseTag();
+
+ final AuthenticationSession session = IsisContext.getAuthenticationSession();
+ List<ObjectAssociation> associations = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, object, Where.OBJECT_FORMS));
+ final List<ObjectAssociation> fields = tag.includedFields(associations);
+ final LinkedObject[] linkFields = tag.linkedFields(fields);
+
+ if (linkAllView != null) {
+ linkAllView = request.getContext().fullUriPath(linkAllView);
+ for (int i = 0; i < linkFields.length; i++) {
+ final boolean isObject = fields.get(i).isOneToOneAssociation();
+ final boolean isNotParseable = !fields.get(i).getSpecification().containsFacet(ParseableFacet.class);
+ linkFields[i] = isObject && isNotParseable ? new LinkedObject(linkAllView) : null;
+ }
+ }
+
+ if (title == null) {
+ title = object.getSpecification().getSingularName();
+ } else if (title.equals("")) {
+ title = null;
+ }
+
+ write(request, object, fields, linkFields, classString, title, labelDelimiter, oddRowClass, evenRowClass, showIcons);
+ } else {
+ request.skipUntilClose();
+ }
+ }
+
+ private void write(
+ final Request request,
+ final ObjectAdapter object,
+ final List<ObjectAssociation> fields,
+ final LinkedObject[] linkFields,
+ final String classString,
+ final String title,
+ final String labelDelimiter,
+ final String oddRowClass,
+ final String evenRowClass,
+ final boolean showIcons) {
+ request.appendHtml("<div" + classString + ">");
+ if (title != null) {
+ request.appendHtml("<div class=\"title\">");
+ request.appendAsHtmlEncoded(title);
+ request.appendHtml("</div>");
+ HelpLink.append(request, object.getSpecification().getDescription(), object.getSpecification().getHelp());
+ }
+ int row = 1;
+ for (int i = 0; i < fields.size(); i++) {
+ final ObjectAssociation field = fields.get(i);
+ if (ignoreField(field)) {
+ continue;
+ }
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, Where.OBJECT_FORMS).isVetoed()) {
+ continue;
+ }
+
+ final String description = field.getDescription().equals("") ? "" : "title=\"" + field.getDescription() + "\"";
+ String cls;
+ if (row++ % 2 == 1) {
+ cls = " class=\"field " + (oddRowClass == null ? ODD_ROW_CLASS : oddRowClass) + "\"";
+ } else {
+ cls = " class=\"field " + (evenRowClass == null ? EVEN_ROW_CLASS : evenRowClass) + "\"";
+ }
+ request.appendHtml("<div " + cls + description + "><span class=\"label\">");
+ request.appendAsHtmlEncoded(field.getName());
+ request.appendHtml(labelDelimiter + "</span>");
+ final LinkedObject linkedObject = linkFields[i];
+ addField(request, object, field, linkedObject, showIcons);
+ HelpLink.append(request, field.getDescription(), field.getHelp());
+ request.appendHtml("</div>");
+ }
+ request.appendHtml("</div>");
+ }
+
+ protected void addField(final Request request, final ObjectAdapter object, final ObjectAssociation field, final LinkedObject linkedObject, final boolean showIcons) {
+ FieldValue.write(request, object, field, linkedObject, null, showIcons, 0);
+ }
+
+ protected boolean ignoreField(final ObjectAssociation objectField) {
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
new file mode 100644
index 0000000..286d84d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.util.Iterator;
+import java.util.List;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public abstract class AbstractTableView extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ALL_TABLES) or @Disabled(where=Where.ALL_TABLES) will indeed
+ // be hidden from all tables but will be visible/enabled (perhaps incorrectly)
+ // if annotated with Where.PARENTED_TABLE or Where.STANDALONE_TABLE
+ private final Where where = Where.ALL_TABLES;
+
+ @Override
+ public void process(final Request request) {
+ final RequestContext context = request.getContext();
+
+ ObjectAdapter collection;
+ String parentObjectId = null;
+ boolean isFieldEditable = false;
+ final String field = request.getOptionalProperty(FIELD);
+ final String tableClass = request.getOptionalProperty(CLASS);
+ ObjectSpecification elementSpec;
+ String tableId;
+ if (field != null) {
+ final String objectId = request.getOptionalProperty(OBJECT);
+ final ObjectAdapter object = context.getMappedObjectOrResult(objectId);
+ if (object == null) {
+ throw new ScimpiException("No object for result or " + objectId);
+ }
+ final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
+ if (!objectField.isOneToManyAssociation()) {
+ throw new ScimpiException("Field " + objectField.getId() + " is not a collection");
+ }
+ isFieldEditable = objectField.isUsable(IsisContext.getAuthenticationSession(), object, where).isAllowed();
+ ResolveFieldUtil.resolveField(object, objectField);
+ collection = objectField.get(object);
+ final TypeOfFacet facet = objectField.getFacet(TypeOfFacet.class);
+ elementSpec = facet.valueSpec();
+ parentObjectId = objectId == null ? context.mapObject(object, Scope.REQUEST) : objectId;
+ tableId = request.getOptionalProperty(ID, field);
+ } else {
+ final String id = request.getOptionalProperty(COLLECTION);
+ collection = context.getMappedObjectOrResult(id);
+ elementSpec = collection.getElementSpecification();
+ tableId = request.getOptionalProperty(ID, collection.getElementSpecification().getShortIdentifier());
+ }
+
+ final String summary = request.getOptionalProperty("summary");
+ final String rowClassesList = request.getOptionalProperty(ROW_CLASSES, ODD_ROW_CLASS + "|" + EVEN_ROW_CLASS);
+ String[] rowClasses = null;
+ if (rowClassesList.length() > 0) {
+ rowClasses = rowClassesList.split("[,|/]");
+ }
+
+ final List<ObjectAssociation> allFields = elementSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);
+ final TableContentWriter rowBuilder = createRowBuilder(request, context, isFieldEditable ? parentObjectId : null, allFields, collection);
+ write(request, collection, summary, rowBuilder, tableId, tableClass, rowClasses);
+
+ }
+
+ protected PersistenceSession getPersistenceSession() {
+ return IsisContext.getPersistenceSession();
+ }
+
+ protected abstract TableContentWriter createRowBuilder(final Request request, RequestContext context, final String parent, final List<ObjectAssociation> allFields, ObjectAdapter collection);
+
+ public static void write(
+ final Request request,
+ final ObjectAdapter collection,
+ final String summary,
+ final TableContentWriter rowBuilder,
+ final String tableId,
+ final String tableClass,
+ final String[] rowClasses) {
+ final RequestContext context = request.getContext();
+
+ final String summarySegment = summary == null ? "" : (" summary=\"" + summary + "\"");
+ final String idSegment = tableId == null ? "" : (" id=\"" + tableId + "\"");
+ final String classSegment = tableClass == null ? "" : (" class=\"" + tableClass + "\"");
+ request.appendHtml("<table" + idSegment + classSegment + summarySegment + ">");
+ rowBuilder.writeCaption(request);
+ rowBuilder.writeHeaders(request);
+ rowBuilder.writeFooters(request);
+
+ request.appendHtml("<tbody>");
+ final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
+ final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
+ int row = 1;
+ while (iterator.hasNext()) {
+ final ObjectAdapter element = iterator.next();
+
+ context.addVariable("row", "" + (row), Scope.REQUEST);
+ String cls = "";
+ if (rowClasses != null) {
+ cls = " class=\"" + rowClasses[row % rowClasses.length] + "\"";
+ }
+ request.appendHtml("<tr" + cls + ">");
+ rowBuilder.writeElement(request, context, element);
+ request.appendHtml("</tr>");
+ row++;
+ }
+ request.appendHtml("</tbody>");
+ request.appendHtml("</table>");
+
+ rowBuilder.tidyUp();
+ }
+
+ @Override
+ public String getName() {
+ return "table";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddMessage.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddMessage.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddMessage.java
new file mode 100644
index 0000000..7076f70
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddMessage.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.core.commons.authentication.MessageBroker;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class AddMessage extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String content = request.popBuffer();
+
+ final MessageBroker messageBroker = IsisContext.getMessageBroker();
+ messageBroker.addMessage(content);
+ }
+
+ @Override
+ public String getName() {
+ return "add-message";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddWarning.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddWarning.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddWarning.java
new file mode 100644
index 0000000..ac0d240
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AddWarning.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.core.commons.authentication.MessageBroker;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class AddWarning extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String content = request.popBuffer();
+
+ final MessageBroker messageBroker = IsisContext.getMessageBroker();
+ messageBroker.addWarning(content);
+ }
+
+ @Override
+ public String getName() {
+ return "add-warning";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Errors.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Errors.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Errors.java
new file mode 100644
index 0000000..960997d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Errors.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Errors extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String cls = request.getOptionalProperty(CLASS);
+ final StringBuffer buffer = new StringBuffer();
+ write(request, cls, buffer);
+ if (buffer.length() > 0) {
+ request.appendHtml("<div class=\"error\">");
+ request.appendHtml(buffer.toString());
+ request.appendHtml("</div>");
+ }
+ }
+
+ public static void write(final Request request, String cls, final StringBuffer buffer) {
+ if (cls == null) {
+ cls = "error";
+ }
+ final String message = (String) request.getContext().getVariable("_error-message");
+ if (message != null) {
+ buffer.append(message);
+ }
+ final String details = (String) request.getContext().getVariable("_error-details");
+ if (details != null) {
+ buffer.append(details);
+ }
+
+ /*
+ * final MessageBroker messageBroker = IsisContext.getMessageBroker();
+ * final List<String> warnings = messageBroker.getWarnings(); for (final
+ * String warning : warnings) { buffer.append("<div class=\"" + cls +
+ * "\">" + warning + "</div>"); }
+ */
+ }
+
+ @Override
+ public String getName() {
+ return "errors";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Feedback.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Feedback.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Feedback.java
new file mode 100644
index 0000000..f734ce2
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Feedback.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Feedback extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String cls = request.getOptionalProperty(CLASS);
+ final StringBuffer buffer = new StringBuffer();
+ Errors.write(request, cls, buffer);
+ Warnings.write(cls, buffer);
+ Messages.write(cls, buffer);
+ if (buffer.length() > 0) {
+ request.appendHtml("<div class=\"feedback\">");
+ request.appendHtml(buffer.toString());
+ request.appendHtml("</div>");
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "feedback";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldLabel.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldLabel.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldLabel.java
new file mode 100644
index 0000000..32e2cd8
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldLabel.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class FieldLabel extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ public void process(final Request request) {
+ final String id = request.getOptionalProperty(OBJECT);
+ final String fieldName = request.getRequiredProperty(FIELD);
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
+ if (field == null) {
+ throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
+ }
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+ String delimiter = request.getOptionalProperty("delimiter");
+ if (delimiter == null) {
+ delimiter = ": ";
+ } else if (delimiter.equals("")) {
+ delimiter = null;
+ }
+ write(request, field, delimiter);
+ }
+
+ @Override
+ public String getName() {
+ return "label";
+ }
+
+ public static void write(final Request content, final ObjectAssociation field, final String delimiter) {
+ final String description = field.getDescription();
+ final String titleSegment = description == null || description.equals("") ? null : ("title=\"" + description + "\"");
+ content.appendHtml("<span class=\"label\"" + titleSegment + ">");
+ content.appendAsHtmlEncoded(field.getName());
+ if (delimiter != null) {
+ content.appendHtml("<span class=\"delimiter\">" + delimiter + "</span>");
+ }
+ content.appendHtml("</span>");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldValue.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldValue.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldValue.java
new file mode 100644
index 0000000..3e84218
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/FieldValue.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueFacet;
+import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
+
+public class FieldValue extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ public void process(final Request request) {
+ final String className = request.getOptionalProperty(CLASS);
+ final String id = request.getOptionalProperty(OBJECT);
+ final String fieldName = request.getRequiredProperty(FIELD);
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
+ if (field == null) {
+ throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
+ }
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+ final boolean isIconShowing = request.isRequested(SHOW_ICON, showIconByDefault());
+ final int truncateTo = Integer.valueOf(request.getOptionalProperty(TRUNCATE, "0")).intValue();
+
+ write(request, object, field, null, className, isIconShowing, truncateTo);
+ }
+
+ @Override
+ public String getName() {
+ return "field";
+ }
+
+ public static void write(final Request request, final ObjectAdapter object, final ObjectAssociation field, final LinkedObject linkedField, final String className, final boolean showIcon, final int truncateTo) {
+
+ final ObjectAdapter fieldReference = field.get(object);
+
+ if (fieldReference != null) {
+ final String classSection = "class=\"" + (className == null ? "value" : className) + "\"";
+ request.appendHtml("<span " + classSection + ">");
+ if (field.isOneToOneAssociation()) {
+ try {
+ IsisContext.getPersistenceSession().resolveImmediately(fieldReference);
+ } catch (final ObjectNotFoundException e) {
+ request.appendHtml(e.getMessage() + "</span>");
+ }
+ }
+
+ if (!field.getSpecification().containsFacet(ParseableFacet.class) && showIcon) {
+ request.appendHtml("<img class=\"small-icon\" src=\"" + request.getContext().imagePath(fieldReference) + "\" alt=\"" + field.getSpecification().getShortIdentifier() + "\"/>");
+ }
+
+ if (linkedField != null) {
+ final String id = request.getContext().mapObject(fieldReference, linkedField.getScope(), Scope.INTERACTION);
+ request.appendHtml("<a href=\"" + linkedField.getForwardView() + "?" + linkedField.getVariable() + "=" + id + request.getContext().encodedInteractionParameters() + "\">");
+ }
+ String value = fieldReference == null ? "" : fieldReference.titleString();
+ if (truncateTo > 0 && value.length() > truncateTo) {
+ value = value.substring(0, truncateTo) + "...";
+ }
+
+ // TODO figure out a better way to determine if boolean or a
+ // password
+ final ObjectSpecification spec = field.getSpecification();
+ final BooleanValueFacet facet = spec.getFacet(BooleanValueFacet.class);
+ if (facet != null) {
+ final boolean flag = facet.isSet(fieldReference);
+ final String valueSegment = flag ? " checked=\"checked\"" : "";
+ final String disabled = " disabled=\"disabled\"";
+ request.appendHtml("<input type=\"checkbox\"" + valueSegment + disabled + " />");
+ } else {
+ request.appendAsHtmlEncoded(value);
+ }
+
+ if (linkedField != null) {
+ request.appendHtml("</a>");
+ }
+ request.appendHtml("</span>");
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/GetField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/GetField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/GetField.java
new file mode 100644
index 0000000..8a6ab16
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/GetField.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.text.DecimalFormat;
+import java.text.Format;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.facets.value.date.DateValueFacet;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class GetField extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ public void process(final Request request) {
+ final String id = request.getOptionalProperty(OBJECT);
+ final String fieldName = request.getRequiredProperty(FIELD);
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+ if (object == null) {
+ throw new ScimpiException("No object to get field for: " + fieldName + " - " + id);
+ }
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
+ if (field == null) {
+ throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
+ }
+ final AuthenticationSession session = IsisContext.getAuthenticationSession();
+ if (field.isVisible(session, object, where).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+
+ String pattern = request.getOptionalProperty("decimal-format");
+ Format format = null;
+ if (pattern != null) {
+ format = new DecimalFormat(pattern);
+ }
+ pattern = request.getOptionalProperty("date-format");
+ if (pattern != null) {
+ format = new SimpleDateFormat(pattern);
+ }
+
+ final String name = request.getOptionalProperty(RESULT_NAME, fieldName);
+ final String scopeName = request.getOptionalProperty(SCOPE);
+ final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
+
+ process(request, object, field, format, name, scope);
+ }
+
+ protected void process(final Request request, final ObjectAdapter object, final ObjectAssociation field, final Format format, final String name, final Scope scope) {
+ final ObjectAdapter fieldReference = field.get(object);
+ if (format != null && fieldReference.isValue()) {
+ final DateValueFacet facet = fieldReference.getSpecification().getFacet(DateValueFacet.class);
+ final Date date = facet.dateValue(fieldReference);
+ final String value = format.format(date);
+ request.appendDebug(" " + object + " -> " + value);
+ request.getContext().addVariable(name, Request.getEncoder().encoder(value), scope);
+ } else {
+ final String source = fieldReference == null ? "" : request.getContext().mapObject(fieldReference, scope);
+ request.appendDebug(" " + object + " -> " + source);
+ request.getContext().addVariable(name, source, scope);
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "get-field";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/IncludeObject.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/IncludeObject.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/IncludeObject.java
new file mode 100644
index 0000000..aa3bfff
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/IncludeObject.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+/**
+ * Element to include another file that will display an object.
+ */
+public class IncludeObject extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ public void process(final Request request) {
+ final String path = request.getOptionalProperty("file");
+ String id = request.getOptionalProperty(OBJECT);
+ final String fieldName = request.getOptionalProperty(FIELD);
+ ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+ if (fieldName != null) {
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+ object = field.get(object);
+ id = request.getContext().mapObject(object, Scope.REQUEST);
+ }
+
+ if (object != null) {
+ IsisContext.getPersistenceSession().resolveImmediately(object);
+ request.getContext().addVariable("_object", id, Scope.REQUEST);
+ importFile(request, path);
+ }
+ request.closeEmpty();
+ }
+
+ private static void importFile(final Request request, final String path) {
+ // TODO load in file via HtmlFileParser
+ final File file = new File(path);
+ BufferedReader reader = null;
+ try {
+ if (file.exists()) {
+ reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ request.appendHtml(line);
+ }
+ } else {
+ request.appendHtml("<P classs=\"error\">File " + path + " not found to import</P>");
+ }
+ } catch (final FileNotFoundException e) {
+ throw new RuntimeException(e);
+ } catch (final IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (final IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "include-object";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ListView.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ListView.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ListView.java
new file mode 100644
index 0000000..3bd8352
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ListView.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.util.Iterator;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
+
+public class ListView extends AbstractObjectProcessor {
+
+ @Override
+ public String checkFieldType(final ObjectAssociation objectField) {
+ return objectField.isOneToManyAssociation() ? null : "is not a collection";
+ }
+
+ @Override
+ public void process(final Request request, final ObjectAdapter object) {
+ final String linkRowView = request.getOptionalProperty(LINK_VIEW);
+ final String linkObjectName = request.getOptionalProperty(ELEMENT_NAME, RequestContext.RESULT);
+ final String linkObjectScope = request.getOptionalProperty(SCOPE, Scope.INTERACTION.toString());
+ LinkedObject linkedRow = null;
+ if (linkRowView != null) {
+ linkedRow = new LinkedObject(linkObjectName, linkObjectScope, request.getContext().fullUriPath(linkRowView));
+ }
+ final String bulletType = request.getOptionalProperty("type");
+ write(request, object, linkedRow, bulletType);
+ }
+
+ public static void write(final Request request, final ObjectAdapter collection, final LinkedObject linkRow, final String bulletType) {
+
+ if (bulletType == null) {
+ request.appendHtml("<ol>");
+ } else {
+ request.appendHtml("<ul type=\"" + bulletType + "\">");
+ }
+
+ final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
+ final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
+ while (iterator.hasNext()) {
+ final ObjectAdapter element = iterator.next();
+
+ request.appendHtml("<li>");
+ if (linkRow != null) {
+ final Scope scope = linkRow == null ? Scope.INTERACTION : RequestContext.scope(linkRow.getScope());
+ RequestContext context = request.getContext();
+ final String rowId = context.mapObject(element, scope);
+ request.appendHtml("<a class=\"item-select\" href=\"" + linkRow.getForwardView() + "?" + linkRow.getVariable()
+ + "=" + rowId + context.encodedInteractionParameters() + "\">");
+ }
+ request.appendAsHtmlEncoded(element.titleString());
+ if (linkRow != null) {
+ request.appendHtml("</a>");
+ }
+
+ request.appendHtml("</li>\n");
+ }
+ if (bulletType == null) {
+ request.appendHtml("</ol>");
+ } else {
+ request.appendHtml("</ul>");
+ }
+
+ }
+
+ @Override
+ public String getName() {
+ return "list";
+ }
+
+}
[05/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
new file mode 100644
index 0000000..1efad45
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.util.List;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableView.SimpleTableBuilder;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
+
+public class LongFormView extends AbstractFormView {
+
+ @Override
+ protected void addField(final Request request, final ObjectAdapter object, final ObjectAssociation field, final LinkedObject linkedObject, final boolean showIcons) {
+ if (field.isOneToManyAssociation()) {
+ final String noColumnsString = request.getOptionalProperty("no-columns", "3");
+ final String tableClass = request.getOptionalProperty("table-class");
+ final String rowClassesList = request.getOptionalProperty("row-classes", ODD_ROW_CLASS + "|" + EVEN_ROW_CLASS);
+ String[] rowClasses = new String[0];
+ if (rowClassesList != null) {
+ rowClasses = rowClassesList.split("[,|/]");
+ }
+ int noColumns;
+ ResolveFieldUtil.resolveField(object, field);
+ final ObjectAdapter collection = field.get(object);
+ final ObjectSpecification elementSpec = collection.getElementSpecification();
+ final List<ObjectAssociation> fields = elementSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);
+ if (noColumnsString.equalsIgnoreCase("all")) {
+ noColumns = fields.size();
+ } else {
+ noColumns = Math.min(fields.size(), Integer.valueOf(noColumnsString));
+ }
+ // final boolean isFieldEditable = field.isUsable(IsisContext.getAuthenticationSession(), object).isAllowed();
+ final String summary = "Table of elements in " + field.getName();
+ // TableView.write(request, summary, object, field, collection, noColumns, fields, isFieldEditable, showIconByDefault(), tableClass, rowClasses, linkedObject);
+
+
+ final String headers[] = new String[fields.size()];
+ int h = 0;
+ for (int i = 0; i < noColumns; i++) {
+ if (fields.get(i).isOneToManyAssociation()) {
+ continue;
+ }
+ headers[h++] = fields.get(i).getName();
+ }
+
+ final LinkedObject[] linkedFields = new LinkedObject[fields.size()];
+
+
+ final TableContentWriter rowBuilder =new SimpleTableBuilder(object.titleString(), true, false, "", noColumns, headers, fields, false,
+ showIcons, false, false, false, field.getName(), linkedFields, null);
+ TableView.write(request, collection, summary, rowBuilder, null, tableClass, rowClasses);
+ } else {
+ super.addField(request, object, field, linkedObject, showIcons);
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "long-form";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Messages.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Messages.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Messages.java
new file mode 100644
index 0000000..8ec1420
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Messages.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.util.List;
+import org.apache.isis.core.commons.authentication.MessageBroker;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Messages extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String cls = request.getOptionalProperty(CLASS);
+ final StringBuffer buffer = new StringBuffer();
+ write(cls, buffer);
+ if (buffer.length() > 0) {
+ request.appendHtml("<div class=\"feedback\">");
+ request.appendHtml(buffer.toString());
+ request.appendHtml("</div>");
+ }
+
+ }
+
+ public static void write(String cls, final StringBuffer buffer) {
+ if (cls == null) {
+ cls = "message";
+ }
+ final MessageBroker messageBroker = IsisContext.getMessageBroker();
+ final List<String> messages = messageBroker.getMessages();
+ for (final String message : messages) {
+ buffer.append("<div class=\"" + cls + "\">" + message + "</div>");
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "messages";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/SelectedObject.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/SelectedObject.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/SelectedObject.java
new file mode 100644
index 0000000..7af46ab
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/SelectedObject.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+/**
+ * <swf:selected name="selected" object="${action}" equals="${subaction}" />
+ */
+public class SelectedObject extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String name = request.getOptionalProperty(NAME, "selected");
+ final String objectId = request.getRequiredProperty(OBJECT);
+ final String equalsId = request.getOptionalProperty("equals");
+ final String title = request.getOptionalProperty(BUTTON_TITLE);
+
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(objectId);
+ final ObjectAdapter other = request.getContext().getMappedObjectOrResult(equalsId);
+ if (object == other || object.equals(title)) {
+ // TODO title is not being used!
+ request.getContext().addVariable(ID, " id=\"" + name + "\" ", Scope.INTERACTION);
+ } else {
+ request.getContext().addVariable(ID, "", Scope.INTERACTION);
+ }
+ request.closeEmpty();
+ }
+
+ @Override
+ public String getName() {
+ return "selected";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ShortFormView.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ShortFormView.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ShortFormView.java
new file mode 100644
index 0000000..31e903b
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/ShortFormView.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+
+public class ShortFormView extends AbstractFormView {
+
+ @Override
+ protected boolean ignoreField(final ObjectAssociation field) {
+ return field.isOneToManyAssociation();
+ }
+
+ @Override
+ public String getName() {
+ return "short-form";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBlock.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBlock.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBlock.java
new file mode 100644
index 0000000..2927fab
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBlock.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
+
+public class TableBlock implements BlockContent {
+
+ // {{ collection
+ private ObjectAdapter collection;
+
+ public void setCollection(final ObjectAdapter collection) {
+ this.collection = collection;
+ }
+
+ public ObjectAdapter getCollection() {
+ return collection;
+ }
+ // }}
+
+ // {{ linkView
+ private String linkView;
+
+ public String getlinkView() {
+ return linkView;
+ }
+
+ public void setlinkView(final String linkView) {
+ this.linkView = linkView;
+ }
+ // }}
+
+ // {{ linkName
+ private String linkName;
+
+ public String getlinkName() {
+ return linkName;
+ }
+
+ public void setlinkName(final String linkName) {
+ this.linkName = linkName;
+ }
+ // }}
+
+ // {{ elementName
+ private String elementName;
+
+ public String getElementName() {
+ return elementName;
+ }
+
+ public void setElementName(final String linkObject) {
+ this.elementName = linkObject;
+ }
+ // }}
+
+ private RepeatMarker marker;
+
+ public RepeatMarker getMarker() {
+ return marker;
+ }
+
+ public void setMarker(final RepeatMarker marker) {
+ this.marker = marker;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBuilder.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBuilder.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBuilder.java
new file mode 100644
index 0000000..e726e29
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableBuilder.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.PageWriter;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
+
+public class TableBuilder extends AbstractTableView {
+
+ @Override
+ protected TableContentWriter createRowBuilder(final Request request, final RequestContext context, final String parent, final List<ObjectAssociation> allFields, final ObjectAdapter collection) {
+
+ final String title = request.getOptionalProperty(TABLE_TITLE);
+ final String variable = request.getOptionalProperty(ELEMENT_NAME, ELEMENT);
+ final String headerClass = request.getOptionalProperty("head-" + CLASS);
+
+ final TableBlock block = new TableBlock();
+ block.setCollection(collection);
+ block.setElementName(variable);
+ request.setBlockContent(block);
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String headers = request.popBuffer();
+ return new TableContentWriter() {
+
+ @Override
+ public void writeFooters(final PageWriter writer) {
+ }
+
+ public void tidyUp() {
+ request.popBlockContent();
+ }
+
+ @Override
+ public void writeCaption(PageWriter writer) {
+ if (title != null) {
+ writer.appendHtml("<caption>");
+ writer.appendHtml(title);
+ writer.appendHtml("</thead>");
+ }
+ }
+
+ @Override
+ public void writeHeaders(final PageWriter writer) {
+ final String headerSegment = headerClass == null ? "" : (" class=\"" + headerClass + "\"");
+ writer.appendHtml("<thead" + headerSegment + ">");
+ writer.appendHtml(headers);
+ writer.appendHtml("</thead>");
+ }
+
+ @Override
+ public void writeElement(final Request request, final RequestContext context, final ObjectAdapter element) {
+ context.addVariable(variable, context.mapObject(element, Scope.REQUEST), Scope.REQUEST);
+ final RepeatMarker end = request.createMarker();
+ final RepeatMarker marker = block.getMarker();
+ marker.repeat();
+ request.processUtilCloseTag();
+ end.repeat();
+ }
+ };
+ }
+
+ @Override
+ public String getName() {
+ return "table-builder";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableCell.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableCell.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableCell.java
new file mode 100644
index 0000000..3f99218
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableCell.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class TableCell extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ALL_TABLES) or @Disabled(where=Where.ALL_TABLES) will indeed
+ // be hidden from all tables but will be visible/enabled (perhaps incorrectly)
+ // if annotated with Where.PARENTED_TABLE or Where.STANDALONE_TABLE
+ private final Where where = Where.ALL_TABLES;
+
+ @Override
+ public void process(final Request request) {
+ final TableBlock tableBlock = (TableBlock) request.getBlockContent();
+ final String id = request.getOptionalProperty(OBJECT);
+ final String fieldName = request.getRequiredProperty(FIELD);
+ final String linkView = request.getOptionalProperty(LINK_VIEW);
+ String className = request.getOptionalProperty(CLASS);
+ className = className == null ? "" : " class=\"" + className + "\"";
+ RequestContext context = request.getContext();
+ final ObjectAdapter object = context.getMappedObjectOrVariable(id, tableBlock.getElementName());
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
+ if (field == null) {
+ throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
+ }
+ request.appendHtml("<td" + className + ">");
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed()) {
+ final ObjectAdapter fieldReference = field.get(object);
+ final String source = fieldReference == null ? "" : context.mapObject(fieldReference, Scope.REQUEST);
+ final String name = request.getOptionalProperty(RESULT_NAME, fieldName);
+ context.addVariable(name, Request.getEncoder().encoder(source), Scope.REQUEST);
+
+ if (linkView != null) {
+ final String linkId = context.mapObject(object, Scope.REQUEST);
+ final String linkName = request.getOptionalProperty(LINK_NAME, RequestContext.RESULT);
+ final String linkObject = request.getOptionalProperty(LINK_OBJECT, linkId);
+ request.appendHtml("<a href=\"" + linkView + "?" + linkName + "=" + linkObject + context.encodedInteractionParameters() + "\">");
+ } else if(tableBlock.getlinkView() != null) {
+ String linkObjectInVariable = tableBlock.getElementName();
+ final String linkId = (String) context.getVariable(linkObjectInVariable);
+ request.appendHtml("<a href=\"" + tableBlock.getlinkView() + "?" + tableBlock.getlinkName() + "=" + linkId + context.encodedInteractionParameters() + "\">");
+ }
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String buffer = request.popBuffer();
+ if (buffer.trim().length() == 0) {
+ request.appendAsHtmlEncoded(fieldReference == null ? "" : fieldReference.titleString());
+ } else {
+ request.appendHtml(buffer);
+ }
+ if (linkView != null) {
+ request.appendHtml("</a>");
+ }
+ } else {
+ request.skipUntilClose();
+ }
+ request.appendHtml("</td>");
+ }
+
+ @Override
+ public String getName() {
+ return "table-cell";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableContentWriter.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableContentWriter.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableContentWriter.java
new file mode 100644
index 0000000..10da109
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableContentWriter.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.PageWriter;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public interface TableContentWriter {
+
+ void writeCaption(PageWriter writer);
+
+ void writeHeaders(PageWriter writer);
+
+ void writeFooters(PageWriter writer);
+
+ void writeElement(Request request, RequestContext context, ObjectAdapter element);
+
+ void tidyUp();
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableEmpty.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableEmpty.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableEmpty.java
new file mode 100644
index 0000000..5595207
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableEmpty.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class TableEmpty extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final TableBlock tableBlock = (TableBlock) request.getBlockContent();
+ final ObjectAdapter collection = tableBlock.getCollection();
+ final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
+ if (facet.size(collection) == 0) {
+ String className = request.getOptionalProperty(CLASS);
+ className = className == null ? "" : " class=\"" + className + "\"";
+ request.appendHtml("<tr" + className + ">");
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String buffer = request.popBuffer();
+ request.appendHtml(buffer);
+ request.appendHtml("</td>");
+ } else {
+ request.skipUntilClose();
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "table-empty";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableHeader.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableHeader.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableHeader.java
new file mode 100644
index 0000000..ff04389
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableHeader.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class TableHeader extends AbstractElementProcessor {
+
+ @Override
+ public String getName() {
+ return "table-header";
+ }
+
+ @Override
+ public void process(final Request request) {
+ request.appendHtml("<thead><tr>");
+ request.processUtilCloseTag();
+ request.appendHtml("</tr></thead>");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableRow.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableRow.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableRow.java
new file mode 100644
index 0000000..eb92656
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableRow.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
+
+public class TableRow extends AbstractElementProcessor {
+
+ @Override
+ public String getName() {
+ return "table-row";
+ }
+
+ @Override
+ public void process(final Request request) {
+ final TableBlock block = (TableBlock) request.getBlockContent();
+
+ final RepeatMarker start = request.createMarker();
+ block.setMarker(start);
+
+ final String linkView = request.getOptionalProperty(LINK_VIEW);
+ if (linkView != null) {
+ block.setlinkView(linkView);
+ block.setlinkName(request.getOptionalProperty(LINK_NAME, RequestContext.RESULT));
+ }
+
+ request.skipUntilClose();
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableView.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableView.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableView.java
new file mode 100644
index 0000000..caf984f
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/TableView.java
@@ -0,0 +1,329 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.PageWriter;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedFieldsBlock;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
+import org.apache.isis.viewer.scimpi.dispatcher.view.simple.RemoveElement;
+
+public class TableView extends AbstractTableView {
+
+ static final class SimpleTableBuilder implements TableContentWriter {
+ private final String parent;
+ private final boolean includeHeader;
+ private final boolean includeFooter;
+ private final String title;
+ private final String[] headers;
+ private final List<ObjectAssociation> fields;
+ private final boolean showTitle;
+ private final boolean showIcons;
+ private final boolean showSelectOption;
+ private final boolean showDeleteOption;
+ private final boolean showEditOption;
+ private final String fieldName;
+ private final LinkedObject[] linkedFields;
+ private final LinkedObject linkRow;
+ private final int noColumns;
+
+ SimpleTableBuilder(
+ final String parent,
+ final boolean includeHeader,
+ final boolean includeFooter,
+ final String title,
+ final int noColumns,
+ final String[] headers,
+ final List<ObjectAssociation> fields,
+ final boolean showTitle,
+ final boolean showIcons,
+ final boolean showSelectOption,
+ final boolean showDeleteOption,
+ final boolean showEditOption,
+ final String fieldName,
+ final LinkedObject[] linkedFields,
+ final LinkedObject linkRow) {
+ this.parent = parent;
+ this.includeHeader = includeHeader;
+ this.includeFooter = includeFooter;
+ this.title = title;
+ this.showTitle = showTitle;
+ this.noColumns = noColumns < 1 ? fields.size() : noColumns;
+ this.headers = headers;
+ this.fields = fields;
+ this.showIcons = showIcons;
+ this.showSelectOption = showSelectOption;
+ this.showDeleteOption = showDeleteOption;
+ this.showEditOption = showEditOption;
+ this.fieldName = fieldName;
+ this.linkedFields = linkedFields;
+ this.linkRow = linkRow;
+ }
+
+ @Override
+ public void writeFooters(final PageWriter writer) {
+ if (includeFooter) {
+ writer.appendHtml("<tfoot>");
+ columnHeaders(writer, headers);
+ writer.appendHtml("</tfoot>");
+ }
+ }
+
+ @Override
+ public void writeCaption(PageWriter writer) {
+ if (title != null) {
+ writer.appendHtml("<caption>");
+ writer.appendHtml(title);
+ writer.appendHtml("</caption>");
+ }
+ }
+
+ @Override
+ public void writeHeaders(final PageWriter writer) {
+ if (includeHeader) {
+ writer.appendHtml("<thead>");
+ columnHeaders(writer, headers);
+ writer.appendHtml("</thead>");
+ }
+ }
+
+ private void columnHeaders(final PageWriter writer, final String[] headers) {
+ writer.appendHtml("<tr class=\"column-headers\">");
+ if (showTitle) {
+ writer.appendHtml("<th></th>");
+ }
+ final String[] columnHeaders = headers;
+ for (final String columnHeader : columnHeaders) {
+ if (columnHeader != null) {
+ writer.appendHtml("<th>");
+ writer.appendAsHtmlEncoded(columnHeader);
+ writer.appendHtml("</th>");
+ }
+ }
+ writer.appendHtml("<th class=\"controls\"></th>");
+ writer.appendHtml("</tr>");
+ }
+
+ public void tidyUp() {
+ // request.popBlockContent();
+
+ // Is it the block that is left over, or is the collection form not being closed?
+ }
+
+ @Override
+ public void writeElement(final Request request, final RequestContext context, final ObjectAdapter element) {
+ final String rowId = context.mapObject(element, Scope.INTERACTION);
+ final String scope = linkRow == null ? "" : "&" + SCOPE + "=" + linkRow.getScope();
+ String result = "";
+ result = context.encodedInteractionParameters();
+
+ if (noColumns == 0) {
+ request.appendHtml("<td>");
+ if (linkRow != null) {
+ request.appendHtml("<td><a href=\"" + linkRow.getForwardView() + "?" + linkRow.getVariable() + "=" + rowId + result + scope + "\">");
+ request.appendAsHtmlEncoded(element.titleString());
+ request.appendHtml("</a>");
+ } else {
+ request.appendAsHtmlEncoded(element.titleString());
+ }
+ request.appendHtml("</td>");
+
+ } else {
+ if (showTitle) {
+ request.appendHtml("<td>");
+ request.appendAsHtmlEncoded(element.titleString());
+ request.appendHtml("</td>");
+ }
+
+ for (int i = 0; i < noColumns; i++) {
+ if (fields.get(i).isOneToManyAssociation()) {
+ continue;
+ }
+ request.appendHtml("<td>");
+ final ObjectAdapter field = fields.get(i).get(element);
+ if (field != null) {
+ if (showIcons && !fields.get(i).getSpecification().containsFacet(ParseableFacet.class)) {
+ request.appendHtml("<img class=\"" + "small-icon" + "\" src=\"" + request.getContext().imagePath(field) + "\" alt=\"" + fields.get(i).getSpecification().getShortIdentifier() + "\"/>");
+ }
+ if (linkRow != null) {
+ request.appendHtml("<a href=\"" + linkRow.getForwardView() + "?" + linkRow.getVariable() + "=" + rowId + result + scope + "\">");
+ } else if (linkedFields[i] != null) {
+ final ObjectAdapter fieldObject = fields.get(i).get(element);
+ final String id = context.mapObject(fieldObject, Scope.INTERACTION);
+ request.appendHtml("<a href=\"" + linkedFields[i].getForwardView() + "?" + linkedFields[i].getVariable() + "=" + id + "\">");
+ context.mapObject(fieldObject, RequestContext.scope(linkedFields[i].getScope()));
+
+ }
+ try {
+ request.appendAsHtmlEncoded(field.titleString());
+ } catch (final ObjectNotFoundException e) {
+ request.appendAsHtmlEncoded(e.getMessage());
+ }
+ if (linkRow != null || linkedFields[i] != null) {
+ request.appendHtml("</a>");
+ }
+ }
+ request.appendHtml("</td>");
+
+ }
+ }
+ request.appendHtml("<td class=\"controls\">");
+ if (showSelectOption) {
+ request.appendHtml("<a class=\"button element-select\" href=\"" + "_generic." + Dispatcher.EXTENSION + "?" + RequestContext.RESULT + "=" + rowId + result + scope + "\">view</a>");
+ }
+ if (showEditOption) {
+ request.appendHtml(" <a class=\"button element-edit\" href=\"" + "_generic_edit." + Dispatcher.EXTENSION + "?" + RequestContext.RESULT + "=" + rowId + result + scope + "\">edit</a>");
+ }
+
+ if (showDeleteOption && parent != null) {
+ String view = request.getViewPath();
+ view = context.fullFilePath(view == null ? context.getResourceFile() : view);
+ RemoveElement.write(request, context.getMappedObject(parent), fieldName, element, null, view, view, "delete", "action in-line element-delete confirm");
+ }
+
+ request.appendHtml("</td>");
+
+ }
+ }
+
+ @Override
+ protected TableContentWriter createRowBuilder(
+ final Request request,
+ final RequestContext context,
+ final String parent,
+ final List<ObjectAssociation> allFields,
+ final ObjectAdapter collection) {
+ final String fieldName = request.getOptionalProperty(FIELD);
+ final String title = request.getOptionalProperty(FORM_TITLE);
+ return rowBuilder(request, context, title, parent, fieldName, allFields, showIconByDefault());
+ }
+
+ private static TableContentWriter rowBuilder(
+ final Request request,
+ final RequestContext context,
+ final String title,
+ final String object,
+ final String fieldName,
+ final List<ObjectAssociation> allFields,
+ final boolean showIconByDefault) {
+ final String linkRowView = request.getOptionalProperty(LINK_VIEW);
+ final String linkObjectName = request.getOptionalProperty(ELEMENT_NAME, RequestContext.RESULT);
+ final String linkObjectScope = request.getOptionalProperty(SCOPE, Scope.INTERACTION.toString());
+ final LinkedObject linkRow = linkRowView == null ? null : new LinkedObject(linkObjectName, linkObjectScope, context.fullUriPath(linkRowView));
+ final boolean includeHeader = request.isRequested(HEADER, true);
+ final boolean includeFooter = request.isRequested(FOOTER, false);
+
+ final boolean linkFields = request.isRequested("link-fields", true);
+ final boolean showTitle = request.isRequested(SHOW_TITLE, false);
+ final boolean showIcons = request.isRequested(SHOW_ICON, showIconByDefault);
+ final boolean showSelectOption = request.isRequested(SHOW_SELECT, true);
+ final boolean showEditOption = request.isRequested(SHOW_EDIT, true);
+ final boolean showDeleteOption = request.isRequested(SHOW_DELETE, true);
+
+ final String noColumnsString = request.getOptionalProperty("no-columns", "3");
+
+ final LinkedFieldsBlock block = new LinkedFieldsBlock();
+ request.setBlockContent(block);
+ request.processUtilCloseTag();
+ final List<ObjectAssociation> fields = block.includedFields(allFields);
+ final LinkedObject[] linkedFields = block.linkedFields(fields);
+ for (int i = 0; i < linkedFields.length; i++) {
+ if (linkedFields[i] == null && linkFields && !fields.get(i).getSpecification().containsFacet(ParseableFacet.class)) {
+ linkedFields[i] = new LinkedObject("_generic.shtml");
+ }
+ if (linkedFields[i] != null) {
+ linkedFields[i].setForwardView(context.fullUriPath(linkedFields[i].getForwardView()));
+ }
+ }
+
+ int noColumns;
+ if (noColumnsString.equalsIgnoreCase("all")) {
+ noColumns = fields.size();
+ } else {
+ noColumns = Math.min(fields.size(), Integer.valueOf(noColumnsString));
+ }
+
+ final String headers[] = new String[noColumns];
+ int h = 0;
+ for (int i = 0; i < noColumns; i++) {
+ if (fields.get(i).isOneToManyAssociation()) {
+ continue;
+ }
+ headers[h++] = fields.get(i).getName();
+ }
+
+ request.popBlockContent();
+
+ return new SimpleTableBuilder(object, includeHeader, includeFooter, title, noColumns, headers, fields, showTitle,
+ showIcons, showSelectOption, showDeleteOption, showEditOption, fieldName, linkedFields, linkRow);
+ }
+
+ public static void write(
+ final Request request,
+ final String summary,
+ final ObjectAdapter object,
+ final ObjectAssociation field,
+ final ObjectAdapter collection,
+ final int noColumns,
+ final List<ObjectAssociation> fields,
+ final boolean linkAllFields,
+ final boolean showIconByDefault,
+ final String tableClass,
+ final String[] rowClasses,
+ LinkedObject linkedObject) {
+ final LinkedObject[] linkedFields = new LinkedObject[fields.size()];
+ if (linkAllFields) {
+ for (int i = 0; i < linkedFields.length; i++) {
+ if (fields.get(i).isOneToOneAssociation()) {
+ linkedFields[i] = linkedObject == null ? new LinkedObject("_generic.shtml") : linkedObject;
+ }
+ }
+ }
+
+ final String headers[] = new String[fields.size()];
+ int h = 0;
+ for (int i = 0; i < fields.size(); i++) {
+ if (fields.get(i).isOneToManyAssociation()) {
+ continue;
+ }
+ headers[h++] = fields.get(i).getName();
+ }
+
+ final RequestContext context = request.getContext();
+ final TableContentWriter rowBuilder = rowBuilder(request, context, null, context.mapObject(object, Scope.REQUEST), field.getIdentifier().getMemberName(), fields,
+ showIconByDefault);
+ write(request, collection, summary, rowBuilder, null, null, null);
+ }
+
+ @Override
+ public String getName() {
+ return "table";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Title.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Title.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Title.java
new file mode 100644
index 0000000..d3b6904
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Title.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+public class Title extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String id = request.getOptionalProperty(OBJECT);
+ final String fieldName = request.getOptionalProperty(FIELD);
+ final int truncateTo = Integer.valueOf(request.getOptionalProperty(TRUNCATE, "0")).intValue();
+ final boolean isIconShowing = request.isRequested(SHOW_ICON, showIconByDefault());
+ String className = request.getOptionalProperty(CLASS);
+ className = className == null ? "title-icon" : className;
+ ObjectAdapter object = MethodsUtils.findObject(request.getContext(), id);
+ if (fieldName != null) {
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+ object = field.get(object);
+ }
+
+ if (object != null) {
+ request.appendHtml("<span class=\"object\">");
+ IsisContext.getPersistenceSession().resolveImmediately(object);
+ if (isIconShowing) {
+ final String iconPath = request.getContext().imagePath(object);
+ request.appendHtml("<img class=\"" + className + "\" src=\"" + iconPath + "\" />");
+ }
+ request.appendTruncated(object.titleString(), truncateTo);
+ request.appendHtml("</span>");
+ }
+ request.closeEmpty();
+ }
+
+ @Override
+ public String getName() {
+ return "title";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Warnings.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Warnings.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Warnings.java
new file mode 100644
index 0000000..52be7d6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/Warnings.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.display;
+
+import java.util.List;
+import org.apache.isis.core.commons.authentication.MessageBroker;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Warnings extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String cls = request.getOptionalProperty(CLASS);
+ final StringBuffer buffer = new StringBuffer();
+ write(cls, buffer);
+ if (buffer.length() > 0) {
+ request.appendHtml("<div class=\"feedback\">");
+ request.appendHtml(buffer.toString());
+ request.appendHtml("</div>");
+ }
+ }
+
+ public static void write(String cls, final StringBuffer buffer) {
+ if (cls == null) {
+ cls = "warning";
+ }
+ final MessageBroker messageBroker = IsisContext.getMessageBroker();
+ final List<String> warnings = messageBroker.getWarnings();
+ for (final String warning : warnings) {
+ buffer.append("<div class=\"" + cls + "\">" + warning + "</div>");
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "warnings";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
new file mode 100644
index 0000000..deafb1a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
@@ -0,0 +1,319 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.facets.object.choices.enums.EnumFacet;
+import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueFacet;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.EditAction;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.HiddenInputField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.HtmlFormBuilder;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
+
+public class EditObject extends AbstractElementProcessor {
+
+ // REVIEW: confirm this rendering context
+ private final Where where = Where.OBJECT_FORMS;
+
+ @Override
+ public void process(final Request request) {
+ final RequestContext context = request.getContext();
+
+ final String objectId = request.getOptionalProperty(OBJECT);
+ final String forwardEditedTo = request.getOptionalProperty(VIEW);
+ final String forwardErrorTo = request.getOptionalProperty(ERROR);
+ final String cancelTo = request.getOptionalProperty(CANCEL_TO);
+ final boolean hideNonEditableFields = request.isRequested(HIDE_UNEDITABLE, false);
+ final boolean showIcon = request.isRequested(SHOW_ICON, showIconByDefault());
+ final String labelDelimiter = request.getOptionalProperty(LABEL_DELIMITER, ":");
+ String buttonTitle = request.getOptionalProperty(BUTTON_TITLE);
+ String formTitle = request.getOptionalProperty(FORM_TITLE);
+ final String formId = request.getOptionalProperty(FORM_ID, request.nextFormId());
+ final String variable = request.getOptionalProperty(RESULT_NAME);
+ final String resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
+ final String scope = request.getOptionalProperty(SCOPE);
+ final String className = request.getOptionalProperty(CLASS, "edit full");
+ final String completionMessage = request.getOptionalProperty(MESSAGE);
+
+ final ObjectAdapter object = context.getMappedObjectOrResult(objectId);
+ final String actualObjectId = context.mapObject(object, Scope.INTERACTION);
+ final String version = context.mapVersion(object);
+
+ final String id = request.getOptionalProperty(ID, object.getSpecification().getShortIdentifier());
+
+ final FormState entryState = (FormState) context.getVariable(ENTRY_FIELDS);
+
+ final ObjectSpecification specification = object.getSpecification();
+ final FormFieldBlock containedBlock = new FormFieldBlock() {
+ @Override
+ public boolean isVisible(final String name) {
+ final ObjectAssociation fld = specification.getAssociation(name);
+ final boolean isVisible = fld.isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed();
+ final boolean isUseable = fld.isUsable(IsisContext.getAuthenticationSession(), object, where).isAllowed();
+ return isVisible && isUseable;
+ }
+
+ @Override
+ public ObjectAdapter getCurrent(final String name) {
+ ObjectAdapter value = null;
+ if (entryState != null) {
+ final FieldEditState field2 = entryState.getField(name);
+ value = field2.getValue();
+ }
+ if (value == null) {
+ final ObjectAssociation fld = specification.getAssociation(name);
+ value = fld.get(object);
+ }
+ return value;
+ }
+
+ @Override
+ public boolean isNullable(final String name) {
+ final ObjectAssociation fld = specification.getAssociation(name);
+ return !fld.isMandatory();
+ }
+ };
+
+ request.setBlockContent(containedBlock);
+ request.processUtilCloseTag();
+
+ final AuthenticationSession session = IsisContext.getAuthenticationSession();
+ List<ObjectAssociation> viewFields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, object, where));
+ viewFields = containedBlock.includedFields(viewFields);
+ final InputField[] formFields = createFields(viewFields);
+
+ initializeFields(context, object, formFields, entryState, !hideNonEditableFields);
+ setDefaults(context, object, formFields, entryState, showIcon);
+
+ copyFieldContent(context, object, formFields, showIcon);
+ overrideWithHtml(context, containedBlock, formFields);
+ String errors = null;
+ if (entryState != null && entryState.isForForm(formId)) {
+ copyEntryState(context, object, formFields, entryState);
+ errors = entryState.getError();
+ }
+
+ final String errorView = context.fullFilePath(forwardErrorTo == null ? context.getResourceFile() : forwardErrorTo);
+ final List<HiddenInputField> hiddenFields = new ArrayList<HiddenInputField>();
+ hiddenFields.add(new HiddenInputField("_" + OBJECT, actualObjectId));
+ hiddenFields.add(new HiddenInputField("_" + VERSION, version));
+ hiddenFields.add(new HiddenInputField("_" + FORM_ID, formId));
+ hiddenFields.add(completionMessage == null ? null : new HiddenInputField("_" + MESSAGE, completionMessage));
+ hiddenFields.add(forwardEditedTo == null ? null : new HiddenInputField("_" + VIEW, context.fullFilePath(forwardEditedTo)));
+ hiddenFields.add(new HiddenInputField("_" + ERROR, errorView));
+ hiddenFields.add(variable == null ? null : new HiddenInputField("_" + RESULT_NAME, variable));
+ hiddenFields.add(resultOverride == null ? null : new HiddenInputField("_" + RESULT_OVERRIDE, resultOverride));
+ hiddenFields.add(scope == null ? null : new HiddenInputField("_" + SCOPE, scope));
+
+ if (!object.isTransient()) {
+ // ensure all booleans are included so the pass back TRUE if set.
+ final List<ObjectAssociation> fields2 = object.getSpecification().getAssociations(Contributed.EXCLUDED);
+ for (int i = 0; i < fields2.size(); i++) {
+ final ObjectAssociation field = fields2.get(i);
+ if (!viewFields.contains(field) && field.getSpecification().containsFacet(BooleanValueFacet.class)) {
+ final String fieldId = field.getId();
+ final String value = getValue(context, field.get(object));
+ hiddenFields.add(new HiddenInputField(fieldId, value));
+ }
+ }
+ }
+
+ if (formTitle == null) {
+ formTitle = specification.getSingularName();
+ }
+
+ if (buttonTitle == null) {
+ buttonTitle = "Save " + specification.getSingularName();
+ } else if (buttonTitle.equals("")) {
+ buttonTitle = "Save";
+ }
+
+ final HiddenInputField[] hiddenFieldArray = hiddenFields.toArray(new HiddenInputField[hiddenFields.size()]);
+ HtmlFormBuilder.createForm(request, EditAction.ACTION + ".app", hiddenFieldArray, formFields, className, id, formTitle,
+ labelDelimiter, null, null, buttonTitle, errors, cancelTo);
+ request.popBlockContent();
+ }
+
+ private InputField[] createFields(final List<ObjectAssociation> fields) {
+ final InputField[] formFields = new InputField[fields.size()];
+ int length = 0;
+ for (int i = 0; i < fields.size(); i++) {
+ if (!fields.get(i).isOneToManyAssociation()) {
+ formFields[i] = new InputField(fields.get(i).getId());
+ length++;
+ }
+ }
+ final InputField[] array = new InputField[length];
+ for (int i = 0, j = 0; i < formFields.length; i++) {
+ if (formFields[i] != null) {
+ array[j++] = formFields[i];
+ }
+ }
+ return array;
+ }
+
+ // TODO duplicated in ActionForm#initializeFields
+ private void initializeFields(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final FormState entryState, final boolean includeUnusableFields) {
+ for (final InputField formField : formFields) {
+ final String fieldId = formField.getName();
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldId);
+ final AuthenticationSession session = IsisContext.getAuthenticationSession();
+ final Consent usable = field.isUsable(session, object, where);
+ final ObjectAdapter[] options = field.getChoices(object);
+ FieldFactory.initializeField(context, object, field, options, field.isMandatory(), formField);
+
+ final boolean isEditable = usable.isAllowed();
+ if (!isEditable) {
+ formField.setDescription(usable.getReason());
+ }
+ formField.setEditable(isEditable);
+ final boolean hiddenField = field.isVisible(session, object, where).isVetoed();
+ final boolean unusable = usable.isVetoed();
+ final boolean hideAsUnusable = unusable && !includeUnusableFields;
+ if (hiddenField || hideAsUnusable) {
+ formField.setHidden(true);
+ }
+ }
+ }
+
+ private void copyFieldContent(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final boolean showIcon) {
+ for (final InputField inputField : formFields) {
+ final String fieldName = inputField.getName();
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed()) {
+ ResolveFieldUtil.resolveField(object, field);
+ final ObjectAdapter fieldValue = field.get(object);
+ if (inputField.isEditable()) {
+ final String value = getValue(context, fieldValue);
+ if (!value.equals("") || inputField.getValue() == null) {
+ inputField.setValue(value);
+ }
+ } else {
+ final String entry = getValue(context, fieldValue);
+ inputField.setHtml(entry);
+ inputField.setType(InputField.HTML);
+
+ }
+
+ if (field.getSpecification().getFacet(ParseableFacet.class) == null) {
+ if (fieldValue != null) {
+ final String iconSegment = showIcon ? "<img class=\"small-icon\" src=\"" + context.imagePath(field.getSpecification()) + "\" alt=\"" + field.getSpecification().getShortIdentifier() + "\"/>" : "";
+ final String entry = iconSegment + fieldValue.titleString();
+ inputField.setHtml(entry);
+ } else {
+ final String entry = "<em>none specified</em>";
+ inputField.setHtml(entry);
+ }
+ }
+ }
+ }
+ }
+
+ private void setDefaults(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final FormState entryState, final boolean showIcon) {
+ for (final InputField formField : formFields) {
+ final String fieldId = formField.getName();
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldId);
+ final ObjectAdapter defaultValue = field.getDefault(object);
+ if (defaultValue == null) {
+ continue;
+ }
+
+ final String title = defaultValue.titleString();
+ if (field.getSpecification().containsFacet(ParseableFacet.class)) {
+ formField.setValue(title);
+ } else if (field.isOneToOneAssociation()) {
+ final ObjectSpecification objectSpecification = field.getSpecification();
+ if (defaultValue != null) {
+ final String iconSegment = showIcon ? "<img class=\"small-icon\" src=\"" + context.imagePath(objectSpecification) + "\" alt=\"" + objectSpecification.getShortIdentifier() + "\"/>" : "";
+ final String html = iconSegment + title;
+ formField.setHtml(html);
+ final String value = defaultValue == null ? null : context.mapObject(defaultValue, Scope.INTERACTION);
+ formField.setValue(value);
+ }
+ }
+ }
+ }
+
+ private void overrideWithHtml(final RequestContext context, final FormFieldBlock containedBlock, final InputField[] formFields) {
+ for (final InputField formField : formFields) {
+ final String fieldId = formField.getName();
+ if (containedBlock.hasContent(fieldId)) {
+ final String content = containedBlock.getContent(fieldId);
+ if (content != null) {
+ formField.setHtml(content);
+ formField.setValue(null);
+ formField.setType(InputField.HTML);
+ }
+ }
+ }
+ }
+
+ private void copyEntryState(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final FormState entryState) {
+ for (final InputField formField : formFields) {
+ final String fieldId = formField.getName();
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldId);
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed() && formField.isEditable()) {
+ final FieldEditState fieldState = entryState.getField(field.getId());
+ final String entry = fieldState == null ? "" : fieldState.getEntry();
+ formField.setValue(entry);
+ final String error = fieldState == null ? "" : fieldState.getError();
+ formField.setErrorText(error);
+ }
+ }
+ }
+
+ private String getValue(final RequestContext context, final ObjectAdapter field) {
+ if (field == null || field.isTransient()) {
+ return "";
+ }
+ final ObjectSpecification specification = field.getSpecification();
+ if (specification.containsFacet(EnumFacet.class)) {
+ return String.valueOf(field.getObject());
+ } else if (specification.getFacet(ParseableFacet.class) == null) {
+ return context.mapObject(field, Scope.INTERACTION);
+ } else {
+ return field.titleString();
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "edit";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FieldFactory.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FieldFactory.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FieldFactory.java
new file mode 100644
index 0000000..35a9158
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FieldFactory.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacet;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueFacet;
+import org.apache.isis.core.metamodel.facets.value.password.PasswordValueFacet;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
+
+public class FieldFactory {
+
+ public static void initializeField(final RequestContext context, final ObjectAdapter object, final ObjectFeature param, final ObjectAdapter[] optionsForParameter, final boolean isRequired, final InputField field) {
+
+ field.setLabel(param.getName());
+ field.setDescription(param.getDescription());
+ field.setDataType(param.getSpecification().getShortIdentifier());
+ if (param instanceof ObjectMember) {
+ field.setHelpReference(((ObjectMember) param).getHelp());
+ } else {
+ final HelpFacet helpFacet = param.getFacet(HelpFacet.class);
+ final String value = helpFacet.value();
+ field.setHelpReference(value);
+ }
+ field.setRequired(isRequired);
+ field.setHidden(false);
+
+ if (param.getSpecification().getFacet(ParseableFacet.class) != null) {
+ final int maxLength = param.getFacet(MaxLengthFacet.class).value();
+ field.setMaxLength(maxLength);
+
+ final TypicalLengthFacet typicalLengthFacet = param.getFacet(TypicalLengthFacet.class);
+ if (typicalLengthFacet.isDerived() && maxLength > 0) {
+ field.setWidth(maxLength);
+ } else {
+ field.setWidth(typicalLengthFacet.value());
+ }
+
+ final MultiLineFacet multiLineFacet = param.getFacet(MultiLineFacet.class);
+ field.setHeight(multiLineFacet.numberOfLines());
+ field.setWrapped(!multiLineFacet.preventWrapping());
+
+ final ObjectSpecification spec = param.getSpecification();
+ if (spec.containsFacet(BooleanValueFacet.class)) {
+ field.setType(InputField.CHECKBOX);
+ } else if (spec.containsFacet(PasswordValueFacet.class)) {
+ field.setType(InputField.PASSWORD);
+ } else {
+ field.setType(InputField.TEXT);
+ }
+
+ } else {
+ field.setType(InputField.REFERENCE);
+ }
+
+ if (optionsForParameter != null) {
+ final int noOptions = optionsForParameter.length;
+ final String[] optionValues = new String[noOptions];
+ final String[] optionTitles = new String[noOptions];
+ for (int j = 0; j < optionsForParameter.length; j++) {
+ final int i = j; // + (field.isRequired() ? 0 : 1);
+ optionValues[i] = getValue(context, optionsForParameter[j]);
+ optionTitles[i] = optionsForParameter[j].titleString();
+ }
+ field.setOptions(optionTitles, optionValues);
+ }
+ }
+
+ private static String getValue(final RequestContext context, final ObjectAdapter field) {
+ if (field == null) {
+ return "";
+ }
+ if (field.getSpecification().getFacet(ParseableFacet.class) == null) {
+ return context.mapObject(field, Scope.INTERACTION);
+ } else {
+ return field.getObject().toString();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormEntry.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormEntry.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormEntry.java
new file mode 100644
index 0000000..5d57740
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormEntry.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class FormEntry extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final FormFieldBlock block = (FormFieldBlock) request.getBlockContent();
+ final String field = request.getRequiredProperty(FIELD);
+ final String value = request.getRequiredProperty(VALUE);
+ final boolean isHidden = request.isRequested(HIDDEN, true);
+ block.exclude(field);
+ // TODO this is replaced because the field is marked as hidden!
+ final String content = "reference <input type=\"" + (isHidden ? "hidden" : "text") + "\" disabled=\"disabled\" name=\"" + field + "\" value=\"" + value + "\" />";
+ block.replaceContent(field, content);
+ }
+
+ @Override
+ public String getName() {
+ return "form-entry";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormField.java
new file mode 100644
index 0000000..55c7425
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormField.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class FormField extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final FormFieldBlock block = (FormFieldBlock) request.getBlockContent();
+ final String field = request.getRequiredProperty(FIELD);
+ if (block.isVisible(field)) {
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String content = request.popBuffer();
+ block.replaceContent(field, content);
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "form-field";
+ }
+
+}
[04/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormFieldBlock.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormFieldBlock.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormFieldBlock.java
new file mode 100644
index 0000000..294a239
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/FormFieldBlock.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.InclusionList;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
+
+public class FormFieldBlock extends InclusionList {
+ private final Map<String, String> content = new HashMap<String, String>();
+ private final Map<String, String> values = new HashMap<String, String>();
+
+ public void replaceContent(final String field, final String htmlString) {
+ content.put(field, htmlString);
+ }
+
+ public boolean hasContent(final String name) {
+ return content.containsKey(name);
+ }
+
+ public String getContent(final String name) {
+ return content.get(name);
+ }
+
+ public boolean isVisible(final String name) {
+ return true;
+ }
+
+ public boolean isNullable(final String name) {
+ return true;
+ }
+
+ public ObjectAdapter getCurrent(final String name) {
+ return null;
+ }
+
+ public void value(final String field, final String value) {
+ values.put(field, value);
+ }
+
+ public void setUpValues(final InputField[] inputFields) {
+ for (final InputField inputField : inputFields) {
+ final String name = inputField.getName();
+ inputField.setValue(values.get(name));
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/HiddenField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/HiddenField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/HiddenField.java
new file mode 100644
index 0000000..71019ea
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/HiddenField.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
+import org.apache.isis.viewer.scimpi.dispatcher.TagOrderException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class HiddenField extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final BlockContent blockContent = request.getBlockContent();
+ if (!(blockContent instanceof FormFieldBlock)) {
+ throw new TagOrderException(request);
+ }
+
+ final String field = request.getOptionalProperty("name");
+ final String value = request.getRequiredProperty("value");
+ final FormFieldBlock block = (FormFieldBlock) blockContent;
+ block.value(field, value);
+ block.exclude(field);
+ }
+
+ @Override
+ public String getName() {
+ return "hidden-field";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/RadioListField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/RadioListField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/RadioListField.java
new file mode 100644
index 0000000..7b3c1e6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/RadioListField.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
+
+import java.util.Iterator;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class RadioListField extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final FormFieldBlock block = (FormFieldBlock) request.getBlockContent();
+ final String field = request.getRequiredProperty(FIELD);
+ if (block.isVisible(field)) {
+ final String id = request.getRequiredProperty(COLLECTION);
+ final String exclude = request.getOptionalProperty("exclude");
+
+ final ObjectAdapter collection = request.getContext().getMappedObjectOrResult(id);
+
+ final RequestContext context = request.getContext();
+ final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
+ final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
+
+ final StringBuffer buffer = new StringBuffer();
+
+ while (iterator.hasNext()) {
+ final ObjectAdapter element = iterator.next();
+ final Scope scope = Scope.INTERACTION;
+ final String elementId = context.mapObject(element, scope);
+ if (exclude != null && context.getMappedObject(exclude) == element) {
+ continue;
+ }
+ final String title = element.titleString();
+ final String checked = "";
+ buffer.append("<input type=\"radio\" name=\"" + field + "\" value=\"" + elementId + "\"" + checked + " />" + title + "</input><br/>\n");
+ }
+
+ block.replaceContent(field, buffer.toString());
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "radio-list";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/Selector.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/Selector.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/Selector.java
new file mode 100644
index 0000000..e814f28
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/Selector.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.edit;
+
+import java.util.Iterator;
+
+import org.apache.isis.core.commons.exceptions.UnknownTypeException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+import org.apache.isis.viewer.scimpi.dispatcher.view.action.ActionForm;
+import org.apache.isis.viewer.scimpi.dispatcher.view.action.CreateFormParameter;
+
+public class Selector extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final FormFieldBlock block = (FormFieldBlock) request.getBlockContent();
+ final String field = request.getRequiredProperty(FIELD);
+ if (block.isVisible(field)) {
+ processElement(request, block, field);
+ }
+ request.skipUntilClose();
+ }
+
+ private void processElement(final Request request, final FormFieldBlock block, final String field) {
+ final String type = request.getOptionalProperty(TYPE, "dropdown");
+ if (!request.isPropertySpecified(METHOD) && request.isPropertySpecified(COLLECTION)) {
+ final String id = request.getRequiredProperty(COLLECTION, Request.NO_VARIABLE_CHECKING);
+ final String selector = showSelectionList(request, id, block.getCurrent(field), block.isNullable(field), type);
+ block.replaceContent(field, selector);
+ } else {
+ final String objectId = request.getOptionalProperty(OBJECT);
+ final String methodName = request.getRequiredProperty(METHOD);
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
+ final ObjectAction action = MethodsUtils.findAction(object, methodName);
+ if (action.getParameterCount() == 0) {
+ final ObjectAdapter collection = action.execute(object, new ObjectAdapter[0]);
+ final String selector = showSelectionList(request, collection, block.getCurrent(field), block.isNullable(field), type);
+ block.replaceContent(field, selector);
+ } else {
+ final String id = "selector_options";
+ final String id2 = (String) request.getContext().getVariable(id);
+ final String selector = showSelectionList(request, id2, block.getCurrent(field), block.isNullable(field), type);
+
+ final CreateFormParameter parameters = new CreateFormParameter();
+ parameters.objectId = objectId;
+ parameters.methodName = methodName;
+ parameters.buttonTitle = request.getOptionalProperty(BUTTON_TITLE, "Search");
+ parameters.formTitle = request.getOptionalProperty(FORM_TITLE);
+ parameters.className = request.getOptionalProperty(CLASS, "selector");
+ parameters.id = request.getOptionalProperty(ID);
+
+ parameters.resultName = id;
+ parameters.forwardResultTo = request.getContext().getResourceFile();
+ parameters.forwardVoidTo = "error";
+ parameters.forwardErrorTo = parameters.forwardResultTo;
+ parameters.scope = Scope.REQUEST.name();
+ request.pushNewBuffer();
+ ActionForm.createForm(request, parameters);
+ block.replaceContent(field, selector);
+
+ request.appendHtml(request.popBuffer());
+ }
+ }
+ }
+
+ private String showSelectionList(final Request request, final String collectionId, final ObjectAdapter selectedItem, final boolean allowNotSet, final String type) {
+ if (collectionId != null && !collectionId.equals("")) {
+ final ObjectAdapter collection = request.getContext().getMappedObjectOrResult(collectionId);
+ return showSelectionList(request, collection, selectedItem, allowNotSet, type);
+ } else {
+ return null;
+ }
+ }
+
+ private String showSelectionList(final Request request, final ObjectAdapter collection, final ObjectAdapter selectedItem, final boolean allowNotSet, final String type) {
+ final String field = request.getRequiredProperty(FIELD);
+ final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
+
+ if (type.equals("radio")) {
+ return radioButtonList(request, field, allowNotSet, collection, selectedItem, facet);
+ } else if (type.equals("list")) {
+ final String size = request.getOptionalProperty("size", "5");
+ return dropdownList(request, field, allowNotSet, collection, selectedItem, size, facet);
+ } else if (type.equals("dropdown")) {
+ return dropdownList(request, field, allowNotSet, collection, selectedItem, null, facet);
+ } else {
+ throw new UnknownTypeException(type);
+ }
+ }
+
+ private String radioButtonList(final Request request, final String field, final boolean allowNotSet, final ObjectAdapter collection, final ObjectAdapter selectedItem, final CollectionFacet facet) {
+ final RequestContext context = request.getContext();
+ final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
+ final StringBuffer buffer = new StringBuffer();
+ if (allowNotSet) {
+ buffer.append("<input type=\"radio\" name=\"" + field + "\" value=\"null\"></input><br/>\n");
+ }
+ while (iterator.hasNext()) {
+ final ObjectAdapter element = iterator.next();
+ final String elementId = context.mapObject(element, Scope.INTERACTION);
+ final String title = element.titleString();
+ final String checked = element == selectedItem ? "checked=\"checked\"" : "";
+ buffer.append("<input type=\"radio\" name=\"" + field + "\" value=\"" + elementId + "\"" + checked + ">" + title + "</input><br/>\n");
+ }
+
+ return buffer.toString();
+ }
+
+ private String dropdownList(final Request request, final String field, final boolean allowNotSet, final ObjectAdapter collection, final ObjectAdapter selectedItem, String size, final CollectionFacet facet) {
+ final RequestContext context = request.getContext();
+ final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
+ final StringBuffer buffer = new StringBuffer();
+ size = size == null ? "" : " size =\"" + size + "\"";
+ buffer.append("<select name=\"" + field + "\"" + size + " >\n");
+ if (allowNotSet) {
+ buffer.append(" <option value=\"null\"></option>\n");
+ }
+ while (iterator.hasNext()) {
+ final ObjectAdapter element = iterator.next();
+ final String elementId = context.mapObject(element, Scope.INTERACTION);
+ final String title = element.titleString();
+ final String checked = element == selectedItem ? "selected=\"selected\"" : "";
+ buffer.append(" <option value=\"" + elementId + "\"" + checked + ">" + title + "</option>\n");
+ }
+ buffer.append("</select>\n");
+ return buffer.toString();
+ }
+
+ @Override
+ public String getName() {
+ return "selector";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/ExcludeField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/ExcludeField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/ExcludeField.java
new file mode 100644
index 0000000..0c12990
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/ExcludeField.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.field;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class ExcludeField extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String field = request.getOptionalProperty(NAME);
+ final InclusionList block = (InclusionList) request.getBlockContent();
+ block.exclude(field);
+ }
+
+ @Override
+ public String getName() {
+ return "exclude";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/IncludeField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/IncludeField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/IncludeField.java
new file mode 100644
index 0000000..bff9858
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/IncludeField.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.field;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class IncludeField extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String field = request.getOptionalProperty(NAME);
+ final InclusionList block = (InclusionList) request.getBlockContent();
+ block.include(field);
+ }
+
+ @Override
+ public String getName() {
+ return "include";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/InclusionList.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/InclusionList.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/InclusionList.java
new file mode 100644
index 0000000..1fdc2f6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/InclusionList.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.field;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
+
+public class InclusionList implements BlockContent {
+ private final Set<String> includedList = new HashSet<String>();
+ private final Set<String> excludedList = new HashSet<String>();
+
+ private boolean inIncludedList(final String fieldName) {
+ return includedList.size() == 0 || includedList.contains(fieldName) || includedList.contains("all");
+ }
+
+ private boolean inExcludedList(final String fieldName) {
+ return excludedList.contains(fieldName) || excludedList.contains("all");
+ }
+
+ public void include(final String field) {
+ includedList.add(field);
+ }
+
+ public void exclude(final String field) {
+ excludedList.add(field);
+ }
+
+ public List<ObjectAssociation> includedFields(final List<ObjectAssociation> originalFields) {
+ final List<ObjectAssociation> includedFields = Lists.newArrayList();
+ for (int i = 0; i < originalFields.size(); i++) {
+ final String id2 = originalFields.get(i).getId();
+ if (includes(id2)) {
+ includedFields.add(originalFields.get(i));
+ }
+ }
+
+ return includedFields;
+ }
+
+ public void hideExcludedParameters(final InputField[] inputFields) {
+ for (final InputField inputField : inputFields) {
+ final String id2 = inputField.getName();
+ if (!includes(id2)) {
+ inputField.setHidden(true);
+ }
+ }
+ }
+
+ public boolean includes(final String id) {
+ return inIncludedList(id) && !inExcludedList(id);
+ }
+
+ public List<ObjectAction> includedActions(final List<ObjectAction> originalActions) {
+ final List<ObjectAction> includedActions = Lists.newArrayList();
+ for (int i = 0; i < originalActions.size(); i++) {
+ final String id2 = originalActions.get(i).getId();
+ if (includes(id2)) {
+ includedActions.add(originalActions.get(i));
+ }
+ }
+
+ return includedActions;
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkField.java
new file mode 100644
index 0000000..74a24e6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkField.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.field;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class LinkField extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String field = request.getOptionalProperty(NAME);
+ final String variable = request.getOptionalProperty(REFERENCE_NAME, RequestContext.RESULT);
+ final String scope = request.getOptionalProperty(SCOPE, Scope.INTERACTION.toString());
+ final String forwardView = request.getOptionalProperty(VIEW, "_generic." + Dispatcher.EXTENSION);
+ final LinkedFieldsBlock tag = (LinkedFieldsBlock) request.getBlockContent();
+ tag.link(field, variable, scope, forwardView);
+ }
+
+ @Override
+ public String getName() {
+ return "link";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedFieldsBlock.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedFieldsBlock.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedFieldsBlock.java
new file mode 100644
index 0000000..5049a3d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedFieldsBlock.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.field;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+
+public class LinkedFieldsBlock extends InclusionList {
+ private final Map<String, LinkedObject> linkedFields = new HashMap<String, LinkedObject>();
+
+ public void link(final String field, final String variable, final String scope, final String forwardView) {
+ include(field);
+ linkedFields.put(field, new LinkedObject(variable, scope, forwardView));
+ }
+
+ public LinkedObject[] linkedFields(final List<ObjectAssociation> fields) {
+ final LinkedObject[] includedFields = new LinkedObject[fields.size()];
+ for (int i = 0; i < fields.size(); i++) {
+ final String id2 = fields.get(i).getId();
+ if (fields.get(i).isOneToOneAssociation() && linkedFields.containsKey(id2)) {
+ includedFields[i] = linkedFields.get(id2);
+ }
+ }
+ return includedFields;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedObject.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedObject.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedObject.java
new file mode 100644
index 0000000..d2c8548
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/field/LinkedObject.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.field;
+
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+
+public class LinkedObject {
+ private final String variable;
+ private final String scope;
+ private String forwardView;
+
+ public LinkedObject(final String variable, final String scope, final String forwardView) {
+ this.variable = variable;
+ this.scope = scope;
+ this.forwardView = forwardView;
+ }
+
+ public LinkedObject(final String forwardView) {
+ this.forwardView = forwardView;
+ scope = Scope.INTERACTION.toString();
+ variable = RequestContext.RESULT;
+ }
+
+ public String getVariable() {
+ return variable;
+ }
+
+ public String getScope() {
+ return scope;
+ }
+
+ public String getForwardView() {
+ return forwardView;
+ }
+
+ public void setForwardView(final String path) {
+ forwardView = path;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HiddenInputField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HiddenInputField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HiddenInputField.java
new file mode 100644
index 0000000..9245bc6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HiddenInputField.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.form;
+
+import org.apache.commons.lang.StringEscapeUtils;
+
+public class HiddenInputField {
+ private final String value;
+ private final String name;
+
+ public HiddenInputField(final String name, final String value) {
+ this.value = value;
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getValue() {
+ return StringEscapeUtils.escapeHtml(value);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HtmlFormBuilder.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HtmlFormBuilder.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HtmlFormBuilder.java
new file mode 100644
index 0000000..fd44cc8
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/HtmlFormBuilder.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.form;
+
+import org.apache.isis.core.commons.exceptions.UnknownTypeException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
+
+public class HtmlFormBuilder {
+
+ public static void createForm(
+ final Request request,
+ final String action,
+ final HiddenInputField[] hiddenFields,
+ final InputField[] fields,
+ final String className,
+ final String id,
+ final String formTitle,
+ final String labelDelimiter,
+ final String description,
+ final String helpReference,
+ final String buttonTitle,
+ final String errors,
+ final String cancelTo) {
+
+ String classSegment = " class=\"" + className + (id == null ? "\"" : "\" id=\"" + id + "\"");
+ request.appendHtml("<form " + classSegment + " action=\"" + action + "\" method=\"post\" accept-charset=\"UTF-8\">\n");
+ if (formTitle != null && formTitle.trim().length() > 0) {
+ classSegment = " class=\"title\"";
+ request.appendHtml("<div" + classSegment + ">");
+ request.appendAsHtmlEncoded(formTitle);
+ request.appendHtml("</div>\n");
+ }
+
+ // TODO reinstate fieldsets when we can specify them
+ // request.appendHtml("<fieldset>\n");
+
+ final String cls = "errors";
+ if (errors != null) {
+ request.appendHtml("<div class=\"" + cls + "\">");
+ request.appendAsHtmlEncoded(errors);
+ request.appendHtml("</div>");
+ }
+ for (final HiddenInputField hiddenField : hiddenFields) {
+ if (hiddenField == null) {
+ continue;
+ }
+ request.appendHtml(" <input type=\"hidden\" name=\"" + hiddenField.getName() + "\" value=\"");
+ request.appendAsHtmlEncoded(hiddenField.getValue());
+ request.appendHtml("\" />\n");
+ }
+ request.appendHtml(request.getContext().interactionFields());
+ for (final InputField fld : fields) {
+ if (fld.isHidden()) {
+ request.appendHtml(" <input type=\"hidden\" name=\"" + fld.getName() + "\" value=\"");
+ request.appendAsHtmlEncoded(fld.getValue());
+ request.appendHtml("\" />\n");
+ } else {
+ final String errorSegment = fld.getErrorText() == null ? "" : "<span class=\"error\">" + fld.getErrorText() + "</span>";
+ final String fieldSegment = createField(fld);
+ final String helpSegment = HelpLink.createHelpSegment(fld.getDescription(), fld.getHelpReference());
+ final String title = fld.getDescription().equals("") ? "" : " title=\"" + fld.getDescription() + "\"";
+ request.appendHtml(" <div class=\"field " + fld.getName() + "\"><label class=\"label\" " + title + ">");
+ request.appendAsHtmlEncoded(fld.getLabel());
+ request.appendHtml(labelDelimiter + "</label>" + fieldSegment + errorSegment + helpSegment + "</div>\n");
+ }
+ }
+
+ request.appendHtml(" <input class=\"button\" type=\"submit\" value=\"");
+ request.appendAsHtmlEncoded(buttonTitle);
+ request.appendHtml("\" name=\"execute\" />\n");
+ HelpLink.append(request, description, helpReference);
+ // TODO alllow forms to be cancelled, returning to previous page.
+ // request.appendHtml(" <div class=\"action\"><a class=\"button\" href=\"reset\">Cancel</a></div>");
+
+ if (cancelTo != null) {
+ request.appendHtml(" <input class=\"button\" type=\"button\" value=\"");
+ request.appendAsHtmlEncoded("Cancel");
+ request.appendHtml("\" onclick=\"window.location = '" + cancelTo + "'\" name=\"cancel\" />\n");
+ }
+
+ // TODO reinstate fieldsets when we can specify them
+ // request.appendHtml("</fieldset>\n");
+ request.appendHtml("</form>\n");
+ }
+
+ private static String createField(final InputField field) {
+ if (field.isHidden()) {
+ if (field.getType() == InputField.REFERENCE) {
+ return createObjectField(field, "hidden");
+ } else {
+ return "";
+ }
+ } else {
+ if (field.getType() == InputField.HTML) {
+ return "<span class=\"value\">" + field.getHtml() + "</span>";
+ } else if (field.getOptionsText() != null) {
+ return createOptions(field);
+ } else if (field.getType() == InputField.REFERENCE) {
+ return createObjectField(field, "text");
+ } else if (field.getType() == InputField.CHECKBOX) {
+ return createCheckbox(field);
+ } else if (field.getType() == InputField.PASSWORD) {
+ return createPasswordField(field);
+ } else if (field.getType() == InputField.TEXT) {
+ if (field.getHeight() > 1) {
+ return createTextArea(field);
+ } else {
+ return createTextField(field);
+ }
+ } else {
+ throw new UnknownTypeException(field.toString());
+ }
+ }
+ }
+
+ private static String createObjectField(final InputField field, final String type) {
+ return field.getHtml();
+ }
+
+ private static String createTextArea(final InputField field) {
+ final String columnsSegment = field.getWidth() == 0 ? "" : " cols=\"" + field.getWidth() / field.getHeight() + "\"";
+ final String rowsSegment = field.getHeight() == 0 ? "" : " rows=\"" + field.getHeight() + "\"";
+ final String wrapSegment = !field.isWrapped() ? "" : " wrap=\"off\"";
+ final String requiredSegment = !field.isRequired() ? "" : " class=\"required\"";
+ final String disabled = field.isEditable() ? "" : " disabled=\"disabled\"";
+ final String maxLength = field.getMaxLength() == 0 ? "" : " maxlength=\"" + field.getMaxLength() + "\"";
+ return "<textarea" + requiredSegment + " name=\"" + field.getName() + "\"" + columnsSegment + rowsSegment + wrapSegment
+ + maxLength + disabled + ">" + Request.getEncoder().encoder(field.getValue()) + "</textarea>";
+ }
+
+ private static String createPasswordField(final InputField field) {
+ final String extra = " autocomplete=\"off\"";
+ return createTextField(field, "password", extra);
+ }
+
+ private static String createTextField(final InputField field) {
+ return createTextField(field, "text", "");
+ }
+
+ private static String createTextField(final InputField field, final String type, final String additionalAttributes) {
+ final String value = field.getValue();
+ final String valueSegment = value == null ? "" : " value=\"" + Request.getEncoder().encoder(value) + "\"";
+ final String lengthSegment = field.getWidth() == 0 ? "" : " size=\"" + field.getWidth() + "\"";
+ final String maxLengthSegment = field.getMaxLength() == 0 ? "" : " maxlength=\"" + field.getMaxLength() + "\"";
+ final String requiredSegment = !field.isRequired() ? "" : " required";
+ final String disabled = field.isEditable() ? "" : " disabled=\"disabled\"";
+ return "<input class=\"" + field.getDataType() + requiredSegment + "\" type=\"" + type + "\" name=\"" + field.getName() + "\"" +
+ valueSegment + lengthSegment + maxLengthSegment + disabled + additionalAttributes + " />";
+ }
+
+ private static String createCheckbox(final InputField field) {
+ final String entryText = field.getValue();
+ final String valueSegment = entryText != null && entryText.toLowerCase().equals("true") ? " checked=\"checked\"" : "";
+ final String disabled = field.isEditable() ? "" : " disabled=\"disabled\"";
+ return "<input type=\"checkbox\" name=\"" + field.getName() + "\" value=\"true\" " + valueSegment + disabled + " />";
+ }
+
+ private static String createOptions(final InputField field) {
+ final String[] options = field.getOptionsText();
+ final String[] ids = field.getOptionValues();
+ final int length = options.length;
+ final String classSegment = field.isRequired() && length == 0 ? " class=\"required\"" : "";
+ final String disabled = field.isEditable() ? "" : " disabled=\"disabled\"";
+ final StringBuffer str = new StringBuffer();
+ str.append("\n <select name=\"" + field.getName() + "\"" + disabled + classSegment + ">\n");
+ boolean offerOther = false;
+ for (int i = 0; i < length; i++) {
+ final String selectedSegment = field.getValue() == null || ids[i].equals(field.getValue()) ? " selected=\"selected\"" : "";
+ if (field.getType() == InputField.TEXT && options[i].equals("__other")) {
+ offerOther = true;
+ } else {
+ str.append(" <option value=\"" + Request.getEncoder().encoder(ids[i]) + "\"" + selectedSegment + ">" + Request.getEncoder().encoder(options[i]) + "</option>\n");
+ }
+ }
+ if (!field.isRequired() || length == 0) {
+ final String selectedSegment = field.getValue() == null || field.getValue().equals("") ? " selected=\"selected\"" : "";
+ str.append(" <option value=\"null\"" + selectedSegment + "></option>\n");
+ }
+ if (offerOther) {
+ str.append(" <option value=\"-OTHER-\">Other:</option>\n");
+ }
+ str.append(" </select>");
+ if (field.getType() == InputField.TEXT) {
+ final String lengthSegment = field.getWidth() == 0 ? "" : " size=\"" + field.getWidth() + "\"";
+ final String hideSegment = " style=\"display: none;\" "; // TODO
+ // only
+ // hide
+ // when JS
+ // enabled
+ str.append(" <input type=\"text\" name=\"" + field.getName() + "-other\"" + hideSegment + lengthSegment + disabled + " />");
+ }
+ str.append("\n");
+ return str.toString();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/InputField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/InputField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/InputField.java
new file mode 100644
index 0000000..0382cc4
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/form/InputField.java
@@ -0,0 +1,224 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.form;
+
+import org.apache.isis.core.commons.util.ToString;
+
+public class InputField {
+ public static final int REFERENCE = 1;
+ public static final int TEXT = 2;
+ public static final int PASSWORD = 3;
+ public static final int CHECKBOX = 4;
+ public static final int HTML = 5;
+
+ private int type;
+
+ private String label;
+ private String description = "";
+ private String helpReference;
+ private String errorText;
+ private final String name;
+ private String dataType;
+
+ private int maxLength = 0;
+ private int width;
+ private int height = 1;
+ private boolean isWrapped = false;
+
+ private boolean isRequired = true;
+ private boolean isEditable = true;
+ private boolean isHidden = false;
+
+ private String[] optionsText;
+ private String[] optionValues;
+
+ private String value;
+ private String html;
+
+ public InputField(final String name) {
+ this.name = name;
+ }
+
+ public String getErrorText() {
+ return errorText;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getDataType() {
+ return dataType;
+ }
+
+ public String getHelpReference() {
+ return helpReference;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean isEditable() {
+ return isEditable;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public String getHtml() {
+ return html;
+ }
+
+ public boolean isHidden() {
+ return isHidden;
+ }
+
+ public String[] getOptionsText() {
+ return optionsText;
+ }
+
+ public String[] getOptionValues() {
+ return optionValues;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public boolean isWrapped() {
+ return isWrapped;
+ }
+
+ public boolean isRequired() {
+ return isRequired;
+ }
+
+ public int getMaxLength() {
+ return maxLength;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setErrorText(final String errorText) {
+ this.errorText = errorText;
+ }
+
+ public void setDescription(final String description) {
+ this.description = description;
+ }
+
+ public void setHelpReference(final String helpReference) {
+ this.helpReference = helpReference;
+ }
+
+ public void setLabel(final String label) {
+ this.label = label;
+ }
+
+ public void setEditable(final boolean isEditable) {
+ this.isEditable = isEditable;
+ isRequired = isRequired && isEditable;
+ }
+
+ public void setValue(final String entryText) {
+ this.value = entryText;
+ }
+
+ public void setHtml(final String html) {
+ this.html = html;
+ }
+
+ public void setHidden(final boolean isHidden) {
+ this.isHidden = isHidden;
+ }
+
+ public void setWidth(final int width) {
+ this.width = width;
+ }
+
+ public void setOptions(final String[] optionsText, final String[] optionValues) {
+ this.optionsText = optionsText;
+ this.optionValues = optionValues;
+ }
+
+ public void setHeight(final int height) {
+ this.height = height;
+ }
+
+ public void setWrapped(final boolean isWrapped) {
+ this.isWrapped = isWrapped;
+ }
+
+ public void setRequired(final boolean isRequired) {
+ this.isRequired = isRequired;
+ }
+
+ public void setMaxLength(final int maxLength) {
+ this.maxLength = maxLength;
+ }
+
+ public void setType(final int type) {
+ this.type = type;
+ }
+
+ public void setDataType(String dataType) {
+ this.dataType = dataType;
+ }
+
+ @Override
+ public String toString() {
+ final ToString str = new ToString(this);
+ str.append("name", name);
+ String typeName;
+ switch (type) {
+ case CHECKBOX:
+ typeName = "checkbox";
+ break;
+ case REFERENCE:
+ typeName = "reference";
+ break;
+ case TEXT:
+ typeName = "text";
+ break;
+ default:
+ typeName = "unset";
+ break;
+ }
+ str.append("type", typeName);
+ str.append("datatype", dataType);
+ str.append("editable", isEditable);
+ str.append("hidden", isHidden);
+ str.append("required", isRequired);
+ return str.toString();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logoff.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logoff.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logoff.java
new file mode 100644
index 0000000..1632f5d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logoff.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.logon.LogoutAction;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Logoff extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ LogoutAction.logoutUser(request.getContext());
+ }
+
+ @Override
+ public String getName() {
+ return "logoff";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logon.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logon.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logon.java
new file mode 100644
index 0000000..facd79d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logon.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.isis.core.commons.authentication.AnonymousSession;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.HiddenInputField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.HtmlFormBuilder;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
+
+public class Logon extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ String view = request.getOptionalProperty(VIEW);
+ RequestContext context = request.getContext();
+ if (view == null) {
+ view = (String) context.getVariable("login-path");
+ }
+
+ final boolean isNotLoggedIn = IsisContext.getSession().getAuthenticationSession() instanceof AnonymousSession;
+ if (isNotLoggedIn) {
+ loginForm(request, view);
+ }
+ }
+
+ public static void loginForm(final Request request, final String view) {
+ final String object = request.getOptionalProperty(OBJECT);
+ final String method = request.getOptionalProperty(METHOD, "logon");
+ final String result = request.getOptionalProperty(RESULT_NAME, "_user");
+ final String resultScope = request.getOptionalProperty(SCOPE, Scope.SESSION.name());
+ final String role = request.getOptionalProperty("field", "roles");
+// final String isisUser = request.getOptionalProperty("isis-user", "_web_default");
+ final String formId = request.getOptionalProperty(FORM_ID, request.nextFormId());
+ final String labelDelimiter = request.getOptionalProperty(LABEL_DELIMITER, ":");
+
+ // TODO error if all values are not set (not if use type is not set and all others are still defaults);
+
+ if (object != null) {
+ RequestContext context = request.getContext();
+ context.addVariable(LOGON_OBJECT, object, Scope.SESSION);
+ context.addVariable(LOGON_METHOD, method, Scope.SESSION);
+ context.addVariable(LOGON_RESULT_NAME, result, Scope.SESSION);
+ context.addVariable(LOGON_SCOPE, resultScope, Scope.SESSION);
+ context.addVariable(PREFIX + "roles-field", role, Scope.SESSION);
+// context.addVariable(PREFIX + "isis-user", isisUser, Scope.SESSION);
+ context.addVariable(LOGON_FORM_ID, formId, Scope.SESSION);
+ }
+
+ final String error = request.getOptionalProperty(ERROR, request.getContext().getRequestedFile());
+ final List<HiddenInputField> hiddenFields = new ArrayList<HiddenInputField>();
+ hiddenFields.add(new HiddenInputField(ERROR, error));
+ if (view != null) {
+ hiddenFields.add(new HiddenInputField(VIEW, view));
+ }
+ hiddenFields.add(new HiddenInputField("_" + FORM_ID, formId));
+
+ final FormState entryState = (FormState) request.getContext().getVariable(ENTRY_FIELDS);
+ boolean isforThisForm = entryState != null && entryState.isForForm(formId);
+ if (entryState != null && entryState.isForForm(formId)) {
+ }
+ final InputField nameField = createdField("username", "User Name", InputField.TEXT, isforThisForm ? entryState : null);
+ final String width = request.getOptionalProperty("width");
+ if (width != null) {
+ final int w = Integer.valueOf(width).intValue();
+ nameField.setWidth(w);
+ }
+ final InputField passwordField = createdField("password", "Password", InputField.PASSWORD, isforThisForm ? entryState : null);
+ final InputField[] fields = new InputField[] { nameField, passwordField, };
+
+ final String formTitle = request.getOptionalProperty(FORM_TITLE);
+ final String loginButtonTitle = request.getOptionalProperty(BUTTON_TITLE, "Log in");
+ final String className = request.getOptionalProperty(CLASS, "login");
+ final String id = request.getOptionalProperty(ID, "logon");
+
+ HtmlFormBuilder.createForm(request, "logon.app", hiddenFields.toArray(new HiddenInputField[hiddenFields.size()]), fields,
+ className, id, formTitle, labelDelimiter, null, null, loginButtonTitle,
+ isforThisForm && entryState != null ? entryState.getError() : null , null);
+ }
+
+ protected static InputField createdField(final String fieldName, final String fieldLabel, final int type, final FormState entryState) {
+ final InputField nameField = new InputField(fieldName);
+ nameField.setType(type);
+ nameField.setLabel(fieldLabel);
+ if (entryState != null) {
+ final FieldEditState fieldState = entryState.getField(fieldName);
+ final String entry = fieldState == null ? "" : fieldState.getEntry();
+ nameField.setValue(entry);
+ final String error = fieldState == null ? "" : fieldState.getError();
+ nameField.setErrorText(error);
+ }
+ return nameField;
+ }
+
+ @Override
+ public String getName() {
+ return "logon";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/RestrictAccess.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/RestrictAccess.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/RestrictAccess.java
new file mode 100644
index 0000000..83f2597
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/RestrictAccess.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class RestrictAccess extends AbstractElementProcessor {
+ private static final String LOGIN_VIEW = "login-view";
+ private static final String DEFAULT_LOGIN_VIEW = "login." + Dispatcher.EXTENSION;
+
+ public String getName() {
+ return "restrict-access";
+ }
+
+ public void process(Request request) {
+ if (!request.getContext().isUserAuthenticated()) {
+ final String view = request.getOptionalProperty(LOGIN_VIEW, DEFAULT_LOGIN_VIEW);
+ request.getContext().redirectTo(view);
+ }
+ }
+
+}
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Secure.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Secure.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Secure.java
new file mode 100644
index 0000000..17cd472
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Secure.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
+
+import org.apache.isis.core.commons.authentication.AnonymousSession;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Secure extends AbstractElementProcessor {
+ private static final String LOGIN_VIEW = "login-view";
+
+ @Override
+ public void process(final Request request) {
+ final boolean isLoggedIn = !(IsisContext.getSession().getAuthenticationSession() instanceof AnonymousSession);
+ if (!isLoggedIn) {
+ IsisContext.getMessageBroker().addWarning("You are not currently logged in! Please log in so you can continue.");
+ final String view = request.getOptionalProperty(LOGIN_VIEW, "/login.shtml");
+ request.getContext().redirectTo(view);
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "secure";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/User.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/User.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/User.java
new file mode 100644
index 0000000..4254746
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/User.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
+
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class User extends AbstractElementProcessor {
+ private static final String LOGIN_VIEW = "login-view";
+ private static final String DEFAULT_LOGIN_VIEW = "login." + Dispatcher.EXTENSION;
+ private static final String LOGOUT_VIEW = "logout-view";
+ private static final String DEFAULT_LOGOUT_VIEW = "logout." + Dispatcher.EXTENSION;
+
+ @Override
+ public void process(final Request request) {
+ final boolean isAuthenticatedn = request.getContext().isUserAuthenticated();
+ request.appendHtml("<div class=\"user\">");
+ if (isAuthenticatedn) {
+ displayUserAndLogoutLink(request);
+ } else {
+ displayLoginForm(request);
+ }
+ request.appendHtml("</div>");
+ }
+
+ public void displayLoginForm(final Request request) {
+ String loginView = request.getOptionalProperty(LOGIN_VIEW);
+ if (loginView == null) {
+ Logon.loginForm(request, ".");
+ } else {
+ if (loginView.trim().length() == 0) {
+ loginView = DEFAULT_LOGIN_VIEW;
+ }
+ request.appendHtml("<a div class=\"link\" href=\"" + loginView + "\">Log in</a>");
+ }
+ }
+
+ public void displayUserAndLogoutLink(final Request request) {
+ String user = request.getOptionalProperty(NAME);
+ if (user == null) {
+ user = (String) request.getContext().getVariable("_username");
+ }
+ if (user == null) {
+ user = IsisContext.getAuthenticationSession().getUserName();
+ }
+ request.appendHtml("Welcome <span class=\"name\">");
+ request.appendAsHtmlEncoded(user);
+ request.appendHtml("</span>, ");
+ final String logoutView = request.getOptionalProperty(LOGOUT_VIEW, DEFAULT_LOGOUT_VIEW);
+ request.appendHtml("<a class=\"link\" href=\"logout.app?view=" + logoutView + "\">Log out</a>");
+ }
+
+ @Override
+ public String getName() {
+ return "user";
+ }
+
+}
[44/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.ttf
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.ttf b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index 5cd6cff..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.ttf and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.woff
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.woff b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 9eaecb3..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.woff and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/images/maze-black.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/images/maze-black.png b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/images/maze-black.png
deleted file mode 100644
index 99a49c2..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/images/maze-black.png and /dev/null differ
[28/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.svg
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.svg b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..a9f8469
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.svg
@@ -0,0 +1,504 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="	" horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="¨" horiz-adv-x="1792" />
+<glyph unicode="©" horiz-adv-x="1792" />
+<glyph unicode="®" horiz-adv-x="1792" />
+<glyph unicode="´" horiz-adv-x="1792" />
+<glyph unicode="Æ" horiz-adv-x="1792" />
+<glyph unicode="Ø" horiz-adv-x="1792" />
+<glyph unicode=" " horiz-adv-x="768" />
+<glyph unicode=" " horiz-adv-x="1537" />
+<glyph unicode=" " horiz-adv-x="768" />
+<glyph unicode=" " horiz-adv-x="1537" />
+<glyph unicode=" " horiz-adv-x="512" />
+<glyph unicode=" " horiz-adv-x="384" />
+<glyph unicode=" " horiz-adv-x="256" />
+<glyph unicode=" " horiz-adv-x="256" />
+<glyph unicode=" " horiz-adv-x="192" />
+<glyph unicode=" " horiz-adv-x="307" />
+<glyph unicode=" " horiz-adv-x="85" />
+<glyph unicode=" " horiz-adv-x="307" />
+<glyph unicode=" " horiz-adv-x="384" />
+<glyph unicode="™" horiz-adv-x="1792" />
+<glyph unicode="∞" horiz-adv-x="1792" />
+<glyph unicode="≠" horiz-adv-x="1792" />
+<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="" horiz-adv-x="1792" d="M93 1350q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78z" />
+<glyph unicode="" d="M0 -64q0 50 34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5 q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 32v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5 t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768zM128 1120q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317 q54 43 100.5 115.5t46.5 131.5v11v13.5t-0.5 13t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z " />
+<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354 q-25 27 -25 48zM221 829l306 -297l-73 -421l378 199l377 -199l-72 421l306 297l-422 62l-189 382l-189 -382z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 131q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5 h-874q-121 0 -194 69.5t-73 189.5zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 -96v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 64v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 320q0 -26 19 -45t45 -19h128 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19 h-128q-26 0 -45 -19t-19 -45v-128zM512 -64q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM512 704q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM1536 64 v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM1536 320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19
-45v-128zM1536 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 128v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM0 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 128v384q0 52 38 90t90 38h512q52 0 90 -38 t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 608v192 q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1792" d="M121 608q0 40 28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68z" />
+<glyph unicode="" horiz-adv-x="1408" d="M110 214q0 40 28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-294 -294l294 -294q28 -28 28 -68t-28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294 q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" d="M0 640q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181 q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298zM640 768v640q0 52 38 90t90 38t90 -38t38 -90v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 -96v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM384 -96v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM768 -96v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576 q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 -96v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1536 -96v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23z" />
+<glyph unicode="" d="M0 531v222q0 12 8 23t19 13l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10 q129 -119 165 -170q7 -8 7 -22q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108 q-44 -23 -91 -38q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5z M512 640q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 1056v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23zM256 76q0 -22 7 -40.5 t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5v948h-896v-948zM384 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM640 224v576q0 14 9 23t23 9h64 q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM896 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23z" />
+<glyph unicode="" horiz-adv-x="1664" d="M26 636.5q1 13.5 11 21.5l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5zM256 64 v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45z" />
+<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22 v-376z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 544v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
+<glyph unicode="" horiz-adv-x="1920" d="M50 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256 q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73zM809 540q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 96v320q0 40 28 68t68 28h465l135 -136q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 985q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39q17 -41 -14 -70 l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70zM1152 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM418 620q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM416 672q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23z" />
+<glyph unicode="" d="M0 64v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552q25 -61 25 -123v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM197 576h316l95 -192h320l95 192h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8 t-2.5 -8z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 320v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55t-32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56z" />
+<glyph unicode="" d="M0 640q0 156 61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5 t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298z" />
+<glyph unicode="" d="M0 0v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129 q-19 -19 -45 -19t-45 19t-19 45zM18 800v7q65 268 270 434.5t480 166.5q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179 q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 160v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832z M256 288v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 544v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z M256 800v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 288v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z M512 544v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5zM512 800v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -
13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z " />
+<glyph unicode="" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192z" />
+<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110zM320 320v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19 q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 650q0 151 67 291t179 242.5t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32 q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32 q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314z" />
+<glyph unicode="" horiz-adv-x="768" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1152" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5zM1008 228q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5 q140 -59 225 -188.5t85 -282.5t-85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45zM1109 -7q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19 q13 0 26 -5q211 -91 338 -283.5t127 -422.5t-127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 0v640h640v-640h-640zM0 768v640h640v-640h-640zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM256 256v128h128v-128h-128zM256 1024v128h128v-128h-128zM768 0v640h384v-128h128v128h128v-384h-384v128h-128v-384h-128zM768 768v640h640v-640h-640z M896 896h384v384h-384v-384zM1024 0v128h128v-128h-128zM1024 1024v128h128v-128h-128zM1280 0v128h128v-128h-128z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 0v1408h63v-1408h-63zM94 1v1407h32v-1407h-32zM189 1v1407h31v-1407h-31zM346 1v1407h31v-1407h-31zM472 1v1407h62v-1407h-62zM629 1v1407h31v-1407h-31zM692 1v1407h31v-1407h-31zM755 1v1407h31v-1407h-31zM880 1v1407h63v-1407h-63zM1037 1v1407h63v-1407h-63z M1163 1v1407h63v-1407h-63zM1289 1v1407h63v-1407h-63zM1383 1v1407h63v-1407h-63zM1541 1v1407h94v-1407h-94zM1666 1v1407h32v-1407h-32zM1729 0v1408h63v-1408h-63z" />
+<glyph unicode="" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM704 1408h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M10 184q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23 t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57 q38 -15 59 -43q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5zM575 1056 q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 160v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-224 q-13 0 -22.5 9.5t-9.5 22.5zM384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1408 576q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 128v896q0 106 75 181t181 75h224l51 136q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181zM512 576q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM672 576q0 119 84.5 203.5t203.5 84.5t203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8 t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27 q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14zM555 527q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5 t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12zM533 1292q0 -50 4 -151t4 -152q0 -27 -0.5 -80 t-0.5 -79q0 -46 1 -69q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13zM538.5 165q0.5 -37 4.5 -83.5t12 -66.5q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25 t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5 q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9 t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44zM1414 109.5q9 18.5 42 18.5h80v1024 h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5z" />
+<glyph unicode="" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1 t-103 1t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29 t78 27q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44zM5 -64q0 28 26 49q4 3 36 30t59.5 49 t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5q12 0 42 -19.5t57.5 -41.5t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-5
7.5 -41.5t-42 -19.5q-13 0 -20.5 10.5 t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1536 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h896 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h1280 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 416v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5zM0 800v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192 q-13 0 -22.5 9.5t-9.5 22.5zM384 32v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 416v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 800v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 1184v192q0 13 9.5 22.5t22.5 9.5h1344q13 0
22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5 t-9.5 22.5zM32 704q0 14 9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088 q-13 0 -22.5 9.5t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 416v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23t-9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5z M0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5 t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5q39 -17 39 -59v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5 t-84.5 203.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v192l320 320l160 -160l512 512l416 -416v-448h-1408zM256 960q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" />
+<glyph unicode="" d="M0 -128v416l832 832l416 -416l-832 -832h-416zM128 128h128v-128h107l91 91l-235 235l-91 -91v-107zM298 384q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17zM896 1184l166 165q36 38 90 38q53 0 91 -38l235 -234 q37 -39 37 -91q0 -53 -37 -90l-166 -166z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 896q0 212 150 362t362 150t362 -150t150 -362q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179zM256 896q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73v1088q-148 0 -273 -73t-198 -198t-73 -273z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 512q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275q0 -212 -150 -362t-362 -150t-362 150t-150 362zM256 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29v-190 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM640 256v288l672 672l288 -288l-672 -672h-288zM736 448h96v-96h56l116 116l-152 152l-116 -116v-56zM944 688q16 -16 33 1l350 350q17 17 1 33t-33 -1l-350 -350q-17 -17 -1 -33zM1376 1280l92 92 q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68l-92 -92z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h255q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29v-259 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM256 704q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45l-384 -384 q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5t-38.5 114t-17.5 122z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3 q20 -8 20 -29v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM257 768q0 33 24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110q24 -24 24 -57t-24 -57l-814 -814q-24 -24 -57 -24t-57 24l-430 430 q-24 24 -24 57z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256 q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-710q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45 t-45 -19h-128q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M122 640q0 26 19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 -96v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31l-1328 -738q-23 -13 -39.5 -3t-16.5 36z" />
+<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM896 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45z" />
+<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32v710 q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
+<glyph unicode="" horiz-adv-x="1538" d="M1 64v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM1 525q-6 13 13 32l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13z" />
+<glyph unicode="" horiz-adv-x="1280" d="M154 704q0 26 19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1280" d="M90 128q0 26 19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19 t19 45v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19 t-19 -45v-128z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM387 414q0 -27 19 -46l90 -90q19 -19 46 -19q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19 l90 90q19 19 19 46q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 621q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45q0 28 -18 46l-91 90 q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM417 939q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26 t37.5 -59q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213zM640 160q0 -14 9 -23t23 -9 h192q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320 q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160zM640 1056q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160z" />
+<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143 q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45zM339 512q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5h-109q-26 0 -45 19 t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM429 480q0 13 10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23l-137 -137l137 -137q10 -10 10 -23t-10 -23l-146 -146q-10 -10 -23 -10t-23 10l-137 137 l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM346 640q0 26 19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45z" />
+<glyph unicode="" d="M0 643q0 157 61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5t-61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61t-245 164t-163.5 246t-61 300zM224 643q0 -162 89 -299l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199 t-73 -274zM471 185q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5q0 161 -87 295z" />
+<glyph unicode="" d="M64 576q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5t32.5 -90.5v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90 z" />
+<glyph unicode="" d="M0 512v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M53 565q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651q37 -39 37 -91q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75 q-38 38 -38 90z" />
+<glyph unicode="" horiz-adv-x="1664" d="M53 704q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 416q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45t-19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123 q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22t-13.5 30t-10.5 24q-127 285 -127 451z" />
+<glyph unicode="" d="M0 -64v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45zM781 800q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448 q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
+<glyph unicode="" d="M13 32q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23zM768 704v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10 t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M122.5 408.5q13.5 51.5 59.5 77.5l266 154l-266 154q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5 l-266 -154l266 -154q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 1126l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5l18 621q0 12 -10 18 q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18zM640 161q0 -13 10 -23t23 -10h192q13 0 22 9.5t9 23.5v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190z" />
+<glyph unicode="" d="M0 544v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68 t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23zM376 1120q0 -40 28 -68t68 -28h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68zM608 180q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5v56v468v192h-320v-192v-468v-56zM870 1024h194q40 0 68 28 t28 68t-28 68t-68 28q-43 0 -69 -31z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 121q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96 q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5zM384 448q0 -26 19 -45t45 -19q24 0 45 19 q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45t-19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 -160q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64zM256 640q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100 t113.5 -122.5t72.5 -150.5t27.5 -184q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 34 20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69t-20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69zM128 576q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5q-152 236 -381 353 q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 38 20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5q16 -10 16 -27q0 -7 -1 -9q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87 q-143 65 -263.5 173t-208.5 245q-20 31 -20 69zM128 576q167 -258 427 -375l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5zM896 0l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69t-20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95zM1056 286l280 502q8 -45 8 -84q0 -139 -79 -253.5t-209 -164.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M16 61l768 1408q17 31 47 49t65 18t65 -18t47 -49l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126zM752 992l17 -457q0 -10 10 -16.5t24 -6.5h185q14 0 23.5 6.5t10.5 16.5l18 459q0 12 -10 19q-13 11 -24 11h-220 q-11 0 -24 -11q-10 -7 -10 -21zM768 161q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 477q-1 13 9 25l96 97q9 9 23 9q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16 l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h288v288h-288v-288zM128 224 h288v320h-288v-320zM128 608h288v288h-288v-288zM384 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM480 -128h320v288h-320v-288zM480 224h320v320h-320v-320zM480 608h320v288h-320 v-288zM864 -128h320v288h-320v-288zM864 224h320v320h-320v-320zM864 608h320v288h-320v-288zM1152 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM1248 -128h288v288h-288v-288z M1248 224h288v320h-288v-320zM1248 608h288v288h-288v-288z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 160v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23zM0 1056v192q0 14 9 23t23 9h224q250 0 410 -225q-60 -92 -137 -273q-22 45 -37 72.5 t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23zM743 353q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 q-32 0 -85 -0.5t-81 -1t-73 1t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5 t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281z" />
+<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5 t-98.5 362zM0 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM1024 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M90 250.5q0 26.5 19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M90 773.5q0 26.5 19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 704q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45z M640 1120q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20z " />
+<glyph unicode="" horiz-adv-x="1664" d="M0 1216q0 26 19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024 q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45zM384 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1280 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5t-0.5 12.5zM73 56q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43 q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43z" />
+<glyph unicode="" horiz-adv-x="768" d="M64 64q0 26 19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v384h256v-384h-256zM640 128v896h256v-896h-256zM1024 128v640h256v-640h-256zM1408 128v1024h256v-1024h-256z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 286q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109 q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4q21 -63 74.5 -104 t121.5 -42q-116 -90 -261 -90q-26 0 -50 3z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544 q-119 0 -203.5 84.5t-84.5 203.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 0v1280q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM128 0h1536v128h-1536v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM256 1216h384v128h-384v-128zM512 574 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM640 574q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM736 576q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9 t9 23t-9 23t-23 9q-66 0 -113 -47t-47 -113z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 752q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41q0 -17 -49 -66t-66 -49 q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5zM192 768q0 -80 56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56 t56 136t-56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 549v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8 q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90 q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5zM384 640q0 -106 75 -181t181 -75 t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM1152 58v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0
-25 -51 -138q17 -23 30 -52q149 -15 149 -31 v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1152 1082v140q0 16 149 31q13 29 30 52 q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71 q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1408 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90zM1408 1152q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM616 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5 t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
+<glyph unicode="" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5 t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85 t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640z" />
+<glyph unicode="" d="M0 512v640q0 53 37.5 90.5t90.5 37.5h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186 q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5zM128 1088q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 512h32q16 0 35.5 -9 t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5 t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640z" />
+<glyph unicode="" horiz-adv-x="896" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z M128 940q0 -168 187 -355l581 -560l580 559q188 188 188 356q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5 t-21.5 -143z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5q0 -4 1 -20t0.5 -26.5t-3 -23.5 t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5zM384 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM223 1030q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86z M237 122h231v694h-231v-694zM595 122h231v388q0 38 7 56q15 35 45 59.5t74 24.5q116 0 116 -157v-371h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694z" />
+<glyph unicode="" horiz-adv-x="1152" d="M0 320q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19 t-19 45zM416 672q0 -14 9 -23t23 -9t23 9t9 23v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832 q-119 0 -203.5 84.5t-84.5 203.5zM685 576q0 13 10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
+<glyph unicode="" d="M0 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45zM894.5 78.5q0.5 10.5 3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113 t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5q0 4 -1 20t-0.5 26.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 928v128q0 40 28 68t68 28h288v96q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91t97.5 -37q75 0 133.5 -45.5 t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143zM128 928q0 -78 94.5 -162t235.5 -113q-74 162 -74 371 h-256v-96zM1206 653q141 29 235.5 113t94.5 162v96h-256q0 -209 -74 -371z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204 q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52 t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5h-224q-119 0 -203.5 84.5t-84.5 203.5zM271 315q3 5 13 2 q10 -5 7 -12q-5 -7 -13 -2q-10 5 -7 12zM304 290q6 6 16 -3q9 -11 2 -16q-6 -7 -16 3q-9 11 -2 16zM335 233q-9 13 0 18q9 7 17 -6q9 -12 0 -19q-8 -6 -17 7zM370 206q8 9 20 -3q12 -11 4 -19q-8 -9 -20 3q-13 11 -4 19zM419 168q4 11 19 7q
16 -5 13 -16q-4 -12 -19 -6 q-17 4 -13 15zM481 154q0 11 16 11q17 2 17 -11q0 -11 -16 -11q-17 -2 -17 11zM540 158q-2 12 14 15q16 2 18 -9q2 -10 -14 -14t-18 8z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 -32v320q0 40 28 68t68 28h427q21 -56 70.5 -92t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 936q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69q-17 -40 -59 -40 h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40zM1152 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 433q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5q0 -165 -70 -327.5 t-196 -288t-281 -180.5q-124 -44 -326 -44q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5zM128 434q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5 q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24 q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 1069q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235 t235 -174q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5 t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832z" />
+<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62zM128 38l423 406l89 85l89 -85l423 -406 v1242h-1024v-1242z" />
+<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 905q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5 q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5 t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M44 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5 q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145z" />
+<glyph unicode="" horiz-adv-x="1024" d="M95 631v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44 l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3 q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 96v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68z" />
+<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v608h-1664v-608zM128 1024h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600 q-13 0 -22.5 -9.5t-9.5 -22.5v-224zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="" horiz-adv-x="1408" d="M0 192q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 697v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5t259 -181.5q114 -113 181.5 -259t80.5 -306q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5 t-391.5 184.5q-25 2 -41.5 20t-16.5 43zM0 1201v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294q187 -186 294 -425.5t120 -501.5q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102 q-25 1 -42.5 19.5t-17.5 43.5z" />
+<glyph unicode="" d="M0 160v320q0 25 16 75l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM880 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1136 320q0 33 23.5 56.5t56.5 23.5 t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 672v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50 t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113zM768 633q377 -42 768 -341v954q-394 -302 -768 -343v-270z" />
+<glyph unicode="" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
+<glyph unicode="" d="M2 435q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70l-53 -186l188 -48 q40 -10 52 -51q10 -42 -20 -70l-138 -135l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53 q-41 -12 -70 19q-31 29 -19 70l53 186l-188 48q-40 10 -52 51z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179q0 -105 -75.5 -181 t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q72 0 167 -32 t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139 q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106q-69 -57 -140 -57h-32v-640z" />
+<glyph unicode="" horiz-adv-x="1792" d="M0 769q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5v-640 q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181zM128 768q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119 q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5 t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5t-39 -89.5zM1536 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 640q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5t-90.5 -37.5h-640 q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5zM128 640q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140 v-32h640v32q0 72 32 167t64 193.5t32 179.5q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576q-20 0 -48.5 15t-55 33t-68 33t-84.5 15 q-67 0 -97.5 -44.5t-30.5 -115.5zM1152 -64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 640q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317q0 -142 -77.5 -230t-217.5 -87 l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5zM128 640q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33t55 33t48.5 15v-576q0 -50 38.5 -89 t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112 q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5zM1152 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM251 640q0 -27 18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM256 576q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18 l362 362l91 91q18 18 18 45t-18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 641q0 -27 18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19 t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45t-18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 639q0 -27 18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45t-18 45l-91 91 q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45z" />
+<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM226 979q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18 q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13 q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5 t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.
5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13 q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25 t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5 t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4 q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5q15 10 -7 16q-17 5 -43 -12q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.
5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8 q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5 q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26 q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5 q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -
4.5t-6 -4q-3 -4 0 -14t-2 -14 q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5 q-16 0 -22 -1q-146 -80 -235 -222zM877 26q0 -6 2 -16q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7 t-10 1.5t-11.5 -7q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M21 0q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5l-682 -682q-37 -37 -90 -37q-52 0 -91
<TRUNCATED>
[10/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java
new file mode 100644
index 0000000..85d0f02
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultOidObjectMapping.java
@@ -0,0 +1,511 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.context;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.oid.AggregatedOid;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+
+public class DefaultOidObjectMapping implements ObjectMapping {
+
+ private static final Logger LOG = LoggerFactory.getLogger(DefaultOidObjectMapping.class);
+
+ private final Map<String, TransientRootAdapterMapping> requestTransients = Maps.newHashMap();
+ private final Map<String, TransientRootAdapterMapping> sessionTransients = Maps.newHashMap();
+
+ //private Class<? extends Oid> oidType;
+
+
+ ///////////////////////////////////////
+ // clear, endSession
+ ///////////////////////////////////////
+
+ @Override
+ public void clear() {
+ requestTransients.clear();
+
+ final List<String> remove = Lists.newArrayList();
+ for (final String id : sessionTransients.keySet()) {
+ final Oid oid = sessionTransients.get(id).getOid();
+ if (!oid.isTransient()) {
+ remove.add(id);
+ sessionTransients.put(id, null);
+ }
+ }
+ for (final String id : remove) {
+ sessionTransients.remove(id);
+ }
+ }
+
+ @Override
+ public void endSession() {
+ sessionTransients.clear();
+ }
+
+
+ ///////////////////////////////////////
+ // mapTransientObject
+ ///////////////////////////////////////
+
+ @Override
+ public String mapTransientObject(final ObjectAdapter adapter) {
+ try {
+ final List<ObjectAdapter> savedObject = Lists.newArrayList();
+ final JSONObject data = encodeTransientData(adapter, savedObject);
+ return RequestContext.TRANSIENT_OBJECT_OID_MARKER + data.toString(4);
+ } catch (final JSONException e) {
+ throw new ScimpiException(e);
+ }
+ }
+
+ private JSONObject encodeTransientData(final ObjectAdapter adapter, final List<ObjectAdapter> adaptersToSave) throws JSONException {
+ if (adaptersToSave.contains(adapter)) {
+ return null;
+ }
+ adaptersToSave.add(adapter);
+
+ final JSONObject data = createJsonForAdapter(adapter);
+
+ final ObjectSpecification specification = adapter.getSpecification();
+ for (final ObjectAssociation association : specification.getAssociations(Contributed.EXCLUDED)) {
+ final ObjectAdapter fieldValue = association.get(adapter);
+ final String fieldName = association.getId();
+
+ if (fieldValue == null) {
+ data.put(fieldName, (Object) null);
+ } else if (association.getSpecification().isEncodeable()) {
+ final EncodableFacet encodeableFacet = fieldValue.getSpecification().getFacet(EncodableFacet.class);
+ data.put(fieldName, encodeableFacet.toEncodedString(fieldValue));
+
+ } else if (association instanceof OneToManyAssociation) {
+ final List<JSONObject> collection = Lists.newArrayList();
+ final CollectionFacet facet = fieldValue.getSpecification().getFacet(CollectionFacet.class);
+ for (final ObjectAdapter element : facet.iterable(fieldValue)) {
+ collection.add(encodeTransientData(element, adaptersToSave));
+ }
+ data.put(fieldName, collection);
+ } else {
+ if (fieldValue.isTransient() || fieldValue.isParented()) {
+ final JSONObject saveData = encodeTransientData(fieldValue, adaptersToSave);
+ if (saveData == null) {
+ data.put(fieldName, mapObject(fieldValue, Scope.INTERACTION));
+ } else {
+ data.put(fieldName, saveData);
+ }
+ } else {
+ data.put(fieldName, mapObject(fieldValue, Scope.INTERACTION));
+ }
+ }
+ }
+ return data;
+ }
+
+ private JSONObject createJsonForAdapter(final ObjectAdapter adapter) throws JSONException {
+ final JSONObject data = new JSONObject();
+
+ final Oid oid = adapter.getOid();
+ data.put("_oid", oid.enString(getOidMarshaller()));
+
+ if(oid instanceof RootOid) {
+ return data;
+ }
+
+ if (!(oid instanceof AggregatedOid)) {
+ throw new ScimpiException("Unsupported OID type " + oid);
+ }
+ return data;
+ }
+
+
+
+
+ ////////////////////////////////////////////////////
+ // mapObject (either persistent or transient)
+ ////////////////////////////////////////////////////
+
+ @Override
+ public String mapObject(final ObjectAdapter adapter, final Scope scope) {
+
+ // TODO need to ensure that transient objects are remapped each time so
+ // that any changes are added to
+ // session data
+ // continue work here.....here
+
+ final Oid oid = adapter.getOid();
+// if (oidType == null) {
+// oidType = oid.getClass();
+// }
+
+ String encodedOid = oid.enString(getOidMarshaller());
+
+ //final boolean isTransient = adapter.isTransient();
+ //final String transferableId = (isTransient ? "T" : "P") + adapter.getSpecification().getFullIdentifier() + "@" + encodedOid;
+ final String transferableId = encodedOid;
+ // LOG.debug("encoded " + oid + " as " + transferableId + " ~ " + encodedOid);
+
+ if (adapter.isTransient()) {
+ // old TODO cache these in requests so that Mementos are only created once.
+ // old TODO if Transient/Interaction then return state; other store state in session an return OID string
+ final TransientRootAdapterMapping mapping = new TransientRootAdapterMapping(adapter);
+ mappingFor(scope).put(transferableId, mapping);
+ }
+
+ return transferableId;
+ }
+
+ private Map<String, TransientRootAdapterMapping> mappingFor(final Scope scope) {
+ if (scope == Scope.REQUEST) {
+ return requestTransients;
+ }
+ if (scope == Scope.INTERACTION || scope == Scope.SESSION) {
+ return sessionTransients;
+ }
+ throw new ScimpiException("Can't hold globally transient object");
+ }
+
+
+
+ ////////////////////////////////////////////////////
+ // mappedTransientObject (lookup)
+ ////////////////////////////////////////////////////
+
+ @Override
+ public ObjectAdapter mappedTransientObject(final String jsonObjectData) {
+ final String objectData = jsonObjectData; // StringEscapeUtils.unescapeHtml(data);
+ if(LOG.isDebugEnabled()) {
+ LOG.debug("data" + objectData);
+ }
+
+ try {
+ final JSONObject jsonObject = new JSONObject(objectData);
+ return restoreTransientObject(jsonObject);
+ } catch (final JSONException e) {
+ throw new ScimpiException("Problem reading data: " + jsonObjectData, e);
+ }
+ }
+
+ private ObjectAdapter restoreTransientObject(final JSONObject jsonObject) throws JSONException {
+
+ final ObjectAdapter adapter = getAdapter(jsonObject);
+
+ //final String objectType = jsonObject.getString("_objectType");
+ //final ObjectSpecification specification = getSpecificationLoader().lookupByObjectType(objectType);
+ final ObjectSpecification specification = adapter.getSpecification();
+
+ for (final ObjectAssociation association : specification.getAssociations(Contributed.EXCLUDED)) {
+ final String fieldName = association.getId();
+
+ final Object fieldValue = jsonObject.has(fieldName) ? jsonObject.get(fieldName) : null;
+
+ if (association.getSpecification().isEncodeable()) {
+ if (fieldValue == null) {
+ ((OneToOneAssociation) association).initAssociation(adapter, null);
+ } else {
+ final EncodableFacet encodeableFacet = association.getSpecification().getFacet(EncodableFacet.class);
+ final ObjectAdapter fromEncodedString = encodeableFacet.fromEncodedString((String) fieldValue);
+ ((OneToOneAssociation) association).initAssociation(adapter, fromEncodedString);
+ }
+ } else if (association instanceof OneToManyAssociation) {
+ final JSONArray collection = (JSONArray) fieldValue;
+ for (int i = 0; i < collection.length(); i++) {
+ final JSONObject jsonElement = (JSONObject) collection.get(i);
+ final ObjectAdapter objectToAdd = restoreTransientObject(jsonElement);
+ ((OneToManyAssociation) association).addElement(adapter, objectToAdd);
+ }
+
+ /*
+ * CollectionFacet facet =
+ * fieldValue.getSpecification().getFacet
+ * (CollectionFacet.class); for (ObjectAdapter element :
+ * facet.iterable(fieldValue)) {
+ * collection.add(saveData(element, savedObject)); }
+ * data.put(fieldName, collection);
+ */
+ } else {
+ if (fieldValue == null) {
+ ((OneToOneAssociation) association).initAssociation(adapter, null);
+ } else {
+ if (fieldValue instanceof JSONObject) {
+ final ObjectAdapter fieldObject = restoreTransientObject((JSONObject) fieldValue);
+ ((OneToOneAssociation) association).initAssociation(adapter, fieldObject);
+ } else {
+ final ObjectAdapter field = mappedObject((String) fieldValue);
+ ((OneToOneAssociation) association).initAssociation(adapter, field);
+ }
+ }
+ }
+ }
+ return adapter;
+ }
+
+ private ObjectAdapter getAdapter(final JSONObject jsonObject) throws JSONException {
+
+ //final String objectType = jsonObject.getString("_objectType");
+ //final String id = jsonObject.getString("_id");
+ //final ObjectSpecification objectSpec = getSpecificationLoader().lookupByObjectType(objectType);
+
+ final String oidStr = jsonObject.getString("_oid");
+ final TypedOid typedOid = getOidMarshaller().unmarshal(oidStr, TypedOid.class);
+
+ if(!typedOid.isTransient()) {
+ return getAdapterManager().adapterFor(typedOid);
+ } else {
+ return mappedObject(oidStr);
+ }
+
+// if (objectSpec.isParented() && !objectSpec.isParentedOrFreeCollection()) {
+// final String[] split = id.split("@");
+// final String parentOidStr = split[0];
+// final String aggregatedLocalId = split[1];
+//
+// RootOid parentOid;
+// if(RootOid.class.isAssignableFrom(oidType)) {
+// parentOid = getOidStringifier().deString(parentOidStr);
+// } else if (RootOidDefault.class.isAssignableFrom(oidType)) {
+// parentOid = RootOidDefault.createTransient(objectType, parentOidStr);
+// } else {
+// // REVIEW: for now, don't support holding references to aggregates whose parent is also an aggregate
+// throw new ScimpiException("Unsupported OID type " + oidType);
+// }
+//
+// final AggregatedOid oid = new AggregatedOid(objectType, parentOid, aggregatedLocalId);
+// return getPersistenceSession().recreateAdapter(oid, objectSpec);
+// } else {
+// return mappedObject("T" + objectType + "@" + id); // yuk!
+// }
+ }
+
+
+
+ ////////////////////////////////////////////////////
+ // mappedObject (lookup - either persistent or transient)
+ ////////////////////////////////////////////////////
+
+ @Override
+ public ObjectAdapter mappedObject(final String oidStr) {
+
+ final TypedOid typedOid = getOidMarshaller().unmarshal(oidStr, TypedOid.class);
+
+
+// final char type = oidStr.charAt(0);
+//
+// // Pdom.todo.ToDoItem@OID:TODO:6
+// final String[] split = oidStr.split("@");
+// final String oidData = split[1];
+// final String[] oidDataArray = oidData.split(":");
+// final String objectType = oidDataArray[1];
+// final String aggregatedId = split.length > 2?split[2]:null;
+//
+// final ObjectSpecification spec = getSpecificationLoader().lookupByObjectType(objectType);
+
+ //if ((type == 'T')) {
+ if (typedOid.isTransient()) {
+
+ TransientRootAdapterMapping mapping = sessionTransients.get(oidStr);
+ if (mapping == null) {
+ mapping = requestTransients.get(oidStr);
+ }
+ if (mapping == null) {
+
+ // create as a (transient) root adapter
+ // Oid oid = deString(objectType, oidData, State.TRANSIENT);
+ //return getPersistenceSession().recreateAdapter(oid, pojo);
+
+ return getAdapterManager().adapterFor(typedOid);
+ }
+
+ final ObjectAdapter mappedTransientObject = mapping.getObject();
+ if(LOG.isDebugEnabled()) {
+ LOG.debug("retrieved " + mappedTransientObject.getOid() + " for " + oidStr);
+ }
+
+ return mappedTransientObject;
+ }
+
+ try {
+ //LOG.debug("decoding " + oidData);
+
+ //if (aggregatedId != null) {
+ if(typedOid instanceof AggregatedOid) {
+
+// final RootOid parentOid = deString(objectType, oidData, State.PERSISTENT);
+// Oid aggregatedOid = new AggregatedOid(objectType, parentOid, aggregatedId);
+
+ AggregatedOid aggregatedOid = (AggregatedOid) typedOid;
+ final TypedOid parentOid = aggregatedOid.getParentOid();
+
+ getPersistenceSession().loadObject(parentOid);
+ return getAdapterManager().getAdapterFor(aggregatedOid);
+ }
+
+// RootOid oid = deString(objectType, oidData, State.PERSISTENT);
+// return getPersistenceSession().loadObject(oid);
+
+ return getPersistenceSession().loadObject(typedOid);
+
+ } catch (final SecurityException e) {
+ throw new IsisException(e);
+ }
+ }
+
+
+ ///////////////////////////////////////////////////////
+ // reloadIdentityMap (reloads the session transients)
+ ///////////////////////////////////////////////////////
+
+ @Override
+ public void reloadIdentityMap() {
+ final Iterator<TransientRootAdapterMapping> mappings = sessionTransients.values().iterator();
+ while (mappings.hasNext()) {
+ final TransientRootAdapterMapping mapping = mappings.next();
+ mapping.reload();
+ }
+ }
+
+
+ ////////////////////////////////////////////////////
+ // unmapObject (unmaps the transients)
+ ////////////////////////////////////////////////////
+
+ @Override
+ public void unmapObject(final ObjectAdapter object, final Scope scope) {
+ sessionTransients.remove(object.getOid());
+ requestTransients.remove(object.getOid());
+ }
+
+
+ ///////////////////////////////////////
+ // helpers
+ ///////////////////////////////////////
+
+// enum State { TRANSIENT, PERSISTENT }
+
+// private RootOid deString(String objectType, final String oidData, State stateHint) {
+// if(RootOid.class.isAssignableFrom(oidType)) {
+// return getOidStringifier().deString(oidData);
+// } else {
+// throw new ScimpiException("Unsupported OID type " + oidType);
+// }
+// }
+
+
+// private String enString(RootOid ows) {
+// return getOidStringifier().enString(ows);
+// }
+
+// private String enString(final Oid parentOid, final String aggregatedId) {
+// return enString(parentOid) + "@" + aggregatedId;
+// }
+
+// private String enString(final Oid oid) {
+// final String parentOidStr;
+// if(oid instanceof RootOid) {
+// RootOid ows = (RootOid) oid;
+// parentOidStr = enString(ows);
+// } else if (oid instanceof RootOidDefault) {
+// final RootOidDefault parentSerialOid = (RootOidDefault) oid;
+// parentOidStr = parentSerialOid.getIdentifier();
+// } else {
+// throw new ScimpiException("Unsupported OID type " + oid);
+// }
+// return parentOidStr;
+// }
+
+
+
+ /////////////////////////////////////////////////////////////////////////
+ // debugging
+ /////////////////////////////////////////////////////////////////////////
+
+ @Override
+ public void append(final DebugBuilder debug) {
+ append(debug, requestTransients, "request");
+ append(debug, sessionTransients, "session");
+ }
+
+ private void append(final DebugBuilder debug, final Map<String, TransientRootAdapterMapping> transients, final String type) {
+ final Iterator<String> ids = new HashSet<String>(transients.keySet()).iterator();
+ if (ids.hasNext()) {
+ debug.appendTitle("Transient objects (" + type + ")");
+ while (ids.hasNext()) {
+ final String key = ids.next();
+ debug.appendln(key, transients.get(key).debug());
+ }
+ }
+ }
+
+ @Override
+ public void appendMappings(final DebugBuilder request) {
+ }
+
+
+ ///////////////////////////////////////
+ // from context
+ ///////////////////////////////////////
+
+ protected SpecificationLoaderSpi getSpecificationLoader() {
+ return IsisContext.getSpecificationLoader();
+ }
+
+ protected PersistenceSession getPersistenceSession() {
+ return IsisContext.getPersistenceSession();
+ }
+
+ protected AdapterManager getAdapterManager() {
+ return getPersistenceSession().getAdapterManager();
+ }
+
+ protected OidMarshaller getOidMarshaller() {
+ return IsisContext.getOidMarshaller();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultVersionMapping.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultVersionMapping.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultVersionMapping.java
new file mode 100644
index 0000000..2fb0006
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/DefaultVersionMapping.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.context;
+
+import org.apache.isis.core.metamodel.adapter.version.SerialNumberVersion;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+
+public class DefaultVersionMapping implements VersionMapping {
+
+ @Override
+ public String mapVersion(final Version version) {
+ // SerialNumberVersion v = (SerialNumberVersion) version;
+ // return Long.toHexString(v.getSequence());
+ return version.sequence();
+ }
+
+ @Override
+ public Version getVersion(final String id) {
+ final Long sequence = Long.valueOf(id, 16);
+ return SerialNumberVersion.create(sequence, null, null);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/IndirectObjectMapping.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/IndirectObjectMapping.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/IndirectObjectMapping.java
new file mode 100644
index 0000000..2a5dfff
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/IndirectObjectMapping.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.context;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeSet;
+
+import com.google.common.collect.Maps;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+
+public class IndirectObjectMapping implements ObjectMapping {
+ private final Map<Scope, Map<String, Mapping>> scopedMappings = Maps.newLinkedHashMap();
+ private int nextId = 0;
+
+ public IndirectObjectMapping() {
+ scopedMappings.put(Scope.GLOBAL, Maps.<String,Mapping>newHashMap());
+ scopedMappings.put(Scope.SESSION, Maps.<String,Mapping>newHashMap());
+ scopedMappings.put(Scope.INTERACTION, Maps.<String,Mapping>newHashMap());
+ scopedMappings.put(Scope.REQUEST, Maps.<String,Mapping>newHashMap());
+ }
+
+ private String nextId() {
+ nextId++;
+ return String.valueOf(nextId);
+ }
+
+ @Override
+ public void endSession() {
+ scopedMappings.get(Scope.SESSION).clear();
+ nextId = 0;
+ }
+
+ @Override
+ public void reloadIdentityMap() {
+ reloadIdentityMap(Scope.GLOBAL);
+ reloadIdentityMap(Scope.SESSION);
+ reloadIdentityMap(Scope.INTERACTION);
+
+ final Map<String, Mapping> map = scopedMappings.get(Scope.INTERACTION);
+ scopedMappings.put(Scope.REQUEST, map);
+ scopedMappings.put(Scope.INTERACTION, new HashMap<String, Mapping>());
+ }
+
+ private void reloadIdentityMap(final Scope scope) {
+ final Map<String, Mapping> map = scopedMappings.get(scope);
+ final Iterator<String> ids = map.keySet().iterator();
+ while (ids.hasNext()) {
+ final String key = ids.next();
+ final Mapping mapping = map.get(key);
+ mapping.reload();
+ }
+ }
+
+ @Override
+ public void clear() {
+ scopedMappings.get(Scope.REQUEST).clear();
+ }
+
+ @Override
+ public void unmapObject(final ObjectAdapter object, final Scope scope) {
+ final String id = mapObject(object, scope);
+ scopedMappings.get(scope).remove(id);
+ }
+
+ @Override
+ public void appendMappings(final DebugBuilder debug) {
+ appendMappings(debug, scopedMappings.get(Scope.INTERACTION));
+ }
+
+ private void appendMappings(final DebugBuilder debug, final Map<String, Mapping> map) {
+ final Iterator<String> names = map.keySet().iterator();
+ while (names.hasNext()) {
+ final String id = names.next();
+ final ObjectAdapter object = mappedObject(id);
+ debug.appendln(id, object);
+ }
+ }
+
+ private void appendMappings(final DebugBuilder debug, final Scope scope) {
+ debug.appendTitle("Objects for " + scope);
+ final Map<String, Mapping> map = scopedMappings.get(scope);
+ final Iterator<String> ids = new TreeSet<String>(map.keySet()).iterator();
+ if (!ids.hasNext()) {
+ debug.appendln("None", "");
+ }
+ while (ids.hasNext()) {
+ final String key = ids.next();
+ debug.appendln(key, map.get(key).debug());
+ }
+ }
+
+ private Mapping createMapping(final ObjectAdapter adapter) {
+ if (adapter.isTransient()) {
+ return new TransientRootAdapterMapping(adapter);
+ } else {
+ return new PersistentRootAdapterMapping(adapter);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.isis.webapp.context.ObjectMapping#mappedObject(java.lang.String
+ * )
+ */
+ @Override
+ public ObjectAdapter mappedObject(final String id) {
+ final Iterator<Map<String, Mapping>> iterator = scopedMappings.values().iterator();
+ while (iterator.hasNext()) {
+ final Map<String, Mapping> map = iterator.next();
+ final Mapping mapping = map.get(id);
+ if (mapping != null) {
+ return mapping.getObject();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String mapObject(final ObjectAdapter obj, final Scope scope) {
+ ObjectAdapter object;
+ object = obj;
+ final Mapping mapping = createMapping(object);
+
+ boolean changeScope = false;
+ for (final Scope s : scopedMappings.keySet()) {
+ final Map<String, Mapping> map = scopedMappings.get(s);
+ if (map.containsValue(mapping)) {
+ final String id = findMapping(map, mapping);
+ if (changeScope) {
+ map.remove(id);
+ scopedMappings.get(scope).put(id, mapping);
+ }
+ return id;
+ }
+
+ if (s == scope) {
+ changeScope = true;
+ }
+ }
+
+ final Map<String, Mapping> map = scopedMappings.get(scope);
+ final String id = obj.getSpecification().getShortIdentifier() + "@" + nextId();
+ map.put(id, mapping);
+ return id;
+ }
+
+ private String findMapping(final Map<String, Mapping> map, final Mapping mapping) {
+ final Iterator<String> ids = map.keySet().iterator();
+ while (ids.hasNext()) {
+ final String key = ids.next();
+ if (map.get(key).equals(mapping)) {
+ return key;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void append(final DebugBuilder debug) {
+ debug.appendln("Next ID", nextId);
+
+ appendMappings(debug, Scope.GLOBAL);
+ appendMappings(debug, Scope.SESSION);
+ appendMappings(debug, Scope.INTERACTION);
+ appendMappings(debug, Scope.REQUEST);
+ }
+
+ @Override
+ public ObjectAdapter mappedTransientObject(final String substring) {
+ throw new NotYetImplementedException();
+ }
+
+ @Override
+ public String mapTransientObject(final ObjectAdapter object) {
+ throw new NotYetImplementedException();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java
new file mode 100644
index 0000000..a41481b
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/Mapping.java
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.context;
+
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.commons.ensure.Assert;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.runtime.memento.Memento;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+
+interface Mapping {
+ ObjectAdapter getObject();
+
+ Oid getOid();
+
+ String debug();
+
+ void reload();
+
+ void update();
+}
+
+class TransientRootAdapterMapping implements Mapping {
+ private final RootOid oid;
+ private Memento memento;
+
+ public TransientRootAdapterMapping(final ObjectAdapter adapter) {
+ oid = (RootOid) adapter.getOid();
+ Assert.assertTrue("OID is for persistent", oid.isTransient());
+ Assert.assertTrue("adapter is for persistent", adapter.isTransient());
+ memento = new Memento(adapter);
+ }
+
+ @Override
+ public ObjectAdapter getObject() {
+ return getAdapterManager().getAdapterFor(oid);
+ }
+
+ @Override
+ public Oid getOid() {
+ return oid;
+ }
+
+ @Override
+ public void reload() {
+ memento.recreateObject();
+ }
+
+ @Override
+ public void update() {
+ memento = new Memento(getObject());
+ }
+
+
+ ////////////////////////////////////
+ // debug
+ ////////////////////////////////////
+
+ @Override
+ public String debug() {
+ final DebugString debug = new DebugString();
+ memento.debug(debug);
+ return debug.toString();
+ }
+
+ ////////////////////////////////////
+ // equals, hashCode
+ ////////////////////////////////////
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj == this) {
+ return true;
+ }
+
+ if (obj instanceof TransientRootAdapterMapping) {
+ return ((TransientRootAdapterMapping) obj).oid.equals(oid);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return oid.hashCode();
+ }
+
+
+ ////////////////////////////////////
+ // from context
+ ////////////////////////////////////
+
+ private AdapterManager getAdapterManager() {
+ return getPersistenceSession().getAdapterManager();
+ }
+
+ private PersistenceSession getPersistenceSession() {
+ return IsisContext.getPersistenceSession();
+ }
+}
+
+class PersistentRootAdapterMapping implements Mapping {
+ private final RootOid oid;
+ private final ObjectSpecification spec;
+
+ public PersistentRootAdapterMapping(final ObjectAdapter object) {
+ this.oid = (RootOid) object.getOid();
+ this.spec = object.getSpecification();
+ }
+
+ @Override
+ public Oid getOid() {
+ return oid;
+ }
+
+ @Override
+ public ObjectAdapter getObject() {
+ if (!IsisContext.inTransaction()) {
+ throw new IllegalStateException(getClass().getSimpleName() + " requires transaction in order to load");
+ }
+ return getPersistenceSession().loadObject(oid);
+ }
+
+ @Override
+ public void reload() {
+ // will only recreate if not already in the adapter mgr maps.
+ getAdapterManager().adapterFor(oid);
+ }
+
+
+ @Override
+ public void update() {
+ }
+
+ ////////////////////////////////////
+ // debug
+ ////////////////////////////////////
+
+ @Override
+ public String debug() {
+ return oid + " " + spec.getShortIdentifier() + " " + getAdapterManager().getAdapterFor(oid);
+ }
+
+ ////////////////////////////////////
+ // equals, hashCode
+ ////////////////////////////////////
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj == this) {
+ return true;
+ }
+
+ if (obj instanceof PersistentRootAdapterMapping) {
+ final PersistentRootAdapterMapping other = (PersistentRootAdapterMapping) obj;
+ return oid.equals(other.oid) && spec == other.spec;
+ }
+
+ return false;
+ }
+
+
+ @Override
+ public int hashCode() {
+ int hash = 37;
+ hash = hash * 17 + oid.hashCode();
+ hash = hash * 17 + spec.hashCode();
+ return hash;
+ }
+
+
+ ////////////////////////////////////
+ // from context
+ ////////////////////////////////////
+
+ protected PersistenceSession getPersistenceSession() {
+ return IsisContext.getPersistenceSession();
+ }
+
+ protected AdapterManager getAdapterManager() {
+ return getPersistenceSession().getAdapterManager();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/ObjectMapping.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/ObjectMapping.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/ObjectMapping.java
new file mode 100644
index 0000000..9fe4013
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/ObjectMapping.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.context;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+
+public interface ObjectMapping {
+
+ void reloadIdentityMap();
+ void endSession();
+
+ void clear();
+
+ String mapObject(ObjectAdapter obj, Scope scope);
+ String mapTransientObject(ObjectAdapter object);
+ void unmapObject(ObjectAdapter object, Scope scope);
+
+ ObjectAdapter mappedObject(String oidStr);
+ ObjectAdapter mappedTransientObject(String jsonData);
+
+ void append(DebugBuilder debug);
+ void appendMappings(DebugBuilder debug);
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
new file mode 100644
index 0000000..183a0b2
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
@@ -0,0 +1,857 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.context;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.Serializable;
+import java.util.*;
+import java.util.Map.Entry;
+import com.google.common.collect.Maps;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.commons.factory.InstanceUtil;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.AggregatedOid;
+import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.ErrorCollator;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.action.PropertyException;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsers;
+
+public abstract class RequestContext {
+ private static final Logger LOG = LoggerFactory.getLogger(RequestContext.class);
+ static final String TRANSIENT_OBJECT_OID_MARKER = "~";
+
+ public enum Scope {
+ GLOBAL, SESSION, INTERACTION, REQUEST, ERROR
+ };
+
+ public enum Debug {
+ ON, OFF, PAGE
+ }
+
+ public static Scope scope(final String scopeName) {
+ final String name = scopeName.toUpperCase();
+ if (name.equals(Scope.GLOBAL.toString())) {
+ return Scope.GLOBAL;
+ } else if (name.equals(Scope.SESSION.toString())) {
+ return Scope.SESSION;
+ } else if (name.equals(Scope.INTERACTION.toString())) {
+ return Scope.INTERACTION;
+ } else if (name.equals(Scope.REQUEST.toString())) {
+ return Scope.REQUEST;
+ }
+ throw new IllegalArgumentException("Invalid scope name: " + scopeName);
+ }
+
+ public static Scope scope(final String scopeName, final Scope defaultScope) {
+ if (scopeName == null || scopeName.trim().equals("")) {
+ return defaultScope;
+ } else {
+ return scope(scopeName);
+ }
+ }
+
+ public static final String RESULT = "_result";
+ public static final String ERROR = "_error";
+ public static final String BACK_TO = "_back_to";
+ private static final Map<String, Object> globalVariables = new HashMap<String, Object>();
+ private static final Scope[] SCOPES = new Scope[] { Scope.ERROR, Scope.REQUEST, Scope.INTERACTION, Scope.SESSION, Scope.GLOBAL };
+
+ private final OidMarshaller oidMarshaller = new OidMarshaller();
+
+
+ private final ObjectMapping objectMapping;
+ private final VersionMapping versionMapping;
+ private final Map<Scope, Map<String, Object>> variables;
+ private final StringBuffer debugTrace = new StringBuffer();
+ private final DebugUsers debugUsers;
+
+ private String forwardTo;
+ private String requestedFile;
+ private String requestedParentPath;
+ private AuthenticationSession session;
+ private Debug debug;
+ private String resourceFile;
+ private String resourceParentPath;
+ private ObjectAdapter collection;
+ private boolean isUserAuthenticated;
+
+ public RequestContext(final DebugUsers debugUsers) {
+ this.debugUsers = debugUsers;
+
+ String className = IsisContext.getConfiguration().getString("scimpi.object-mapping.class", DefaultOidObjectMapping.class.getName());
+ objectMapping = InstanceUtil.createInstance(className, ObjectMapping.class);
+ className = IsisContext.getConfiguration().getString("scimpi.version-mapping.class", DefaultVersionMapping.class.getName());
+ versionMapping = InstanceUtil.createInstance(className, VersionMapping.class);
+ variables = new HashMap<Scope, Map<String, Object>>();
+
+ variables.put(Scope.GLOBAL, globalVariables);
+ variables.put(Scope.SESSION, Maps.<String, Object>newHashMap());
+ variables.put(Scope.INTERACTION, Maps.<String, Object>newHashMap());
+ variables.put(Scope.REQUEST, Maps.<String, Object>newHashMap());
+ variables.put(Scope.ERROR, Maps.<String, Object>newHashMap());
+ }
+
+ public void endHttpSession() {
+ objectMapping.endSession();
+ variables.get(Scope.SESSION).clear();
+ session = null;
+ clearSession();
+ }
+
+ // //////////////////////////////////////////////////////////////////
+ // Mapped objects
+ // //////////////////////////////////////////////////////////////////
+
+ public ObjectAdapter getMappedObject(final String oidStr) {
+ if (oidStr == null || oidStr.trim().equals("") || oidStr.trim().equals("null")) {
+ return null;
+ }
+ if (oidStr.equals("collection")) {
+ return collection;
+ }
+ final ObjectAdapter adapter = mappedObject(oidStr);
+ if (adapter == null) {
+ throw new ScimpiException("No object for " + oidStr);
+ }
+ return adapter;
+ }
+
+ public ObjectAdapter getMappedObjectOrResult(final String id) {
+ return getMappedObjectOrVariable(id, RESULT);
+ }
+
+ public ObjectAdapter getMappedObjectOrVariable(String idOrData, final String name) {
+ if (idOrData == null) {
+ idOrData = (String) getVariable(name);
+ if (idOrData == null) {
+ throw new ScimpiException("No variable for " + name);
+ }
+ }
+ if (idOrData.equals("collection")) {
+ return collection;
+ }
+ return getMappedObject(idOrData);
+ }
+
+ public String mapObject(final ObjectAdapter object, final String scopeName, final Scope defaultScope) {
+ final Scope scope = scopeName == null ? defaultScope : scope(scopeName);
+ LOG.debug("mapping " + object + " " + scope);
+ return objectMapping.mapObject(object, scope);
+ }
+
+ private ObjectAdapter mappedObject(String dataOrOid) {
+ if (dataOrOid != null && dataOrOid.equals("")) {
+ return null;
+ }
+ if (dataOrOid == null) {
+ dataOrOid = RESULT;
+ }
+
+ if (dataOrOid.startsWith(TRANSIENT_OBJECT_OID_MARKER + "{")) {
+ return objectMapping.mappedTransientObject(StringEscapeUtils.unescapeHtml(dataOrOid.substring(TRANSIENT_OBJECT_OID_MARKER.length())));
+ }
+
+ final String oidStr = dataOrOid;
+ final TypedOid typedOid = getOidMarshaller().unmarshal(oidStr, TypedOid.class);
+ if(typedOid instanceof RootOid) {
+// final String[] idParts = dataOrOid.split("@");
+// if (idParts.length == 2) {
+ final ObjectAdapter mappedObject = objectMapping.mappedObject(oidStr);
+ if (mappedObject != null) {
+ getPersistenceSession().resolveImmediately(mappedObject);
+ }
+ return mappedObject;
+ }
+
+ //
+ // else, handle aggregate
+ //
+ AggregatedOid aggregatedOid = (AggregatedOid) typedOid;
+ final TypedOid parentOid = aggregatedOid.getParentOid();
+
+ //final ObjectAdapter parentAdapter = objectMapping.mappedObject(idParts[0] + "@" + idParts[1]);
+ final ObjectAdapter parentAdapter = objectMapping.mappedObject(parentOid.enString(getOidMarshaller()));
+ getPersistenceSession().resolveImmediately(parentAdapter);
+
+ //ObjectSpecId objectType = null;
+ //final AggregatedOid aggregatedOid = new AggregatedOid(objectType, (TypedOid) parentAdapter.getOid(), idParts[2]);
+
+ ObjectAdapter aggregatedAdapter = null;
+ outer: for (final ObjectAssociation association : parentAdapter.getSpecification().getAssociations(Contributed.EXCLUDED)) {
+ if (association.getSpecification().isParented()) {
+ final ObjectAdapter objectAdapter = association.get(parentAdapter);
+ if (objectAdapter == null) {
+ continue;
+ }
+ if (association.isOneToManyAssociation()) {
+ final ObjectAdapter coll = objectAdapter;
+ final CollectionFacet facet = coll.getSpecification().getFacet(CollectionFacet.class);
+ for (final ObjectAdapter element : facet.iterable(coll)) {
+ if (element.getOid().equals(aggregatedOid)) {
+ aggregatedAdapter = element;
+ break outer;
+ }
+ }
+ } else {
+ if (objectAdapter.getOid().equals(aggregatedOid)) {
+ aggregatedAdapter = objectAdapter;
+ break;
+ }
+ }
+ } else if (association.isOneToManyAssociation()) {
+ if (association.getId().equals(aggregatedOid.getLocalId())) {
+ //if (association.getId().equals(idParts[2])) {
+ return association.get(parentAdapter);
+ }
+ }
+ }
+ return aggregatedAdapter;
+ }
+
+
+ public boolean isInternalRequest() {
+ final String referrer = getHeader("Referer"); // Note spelling mistake
+ // is intentional
+ return referrer != null && referrer.contains("localhost"); // TODO need
+ // to look
+ // for actual
+ // domain
+ }
+
+ // //////////////////////////////////////////////////////////////////
+ // Version
+ // //////////////////////////////////////////////////////////////////
+
+ public String mapVersion(final ObjectAdapter object) {
+ final Version version = object.getVersion();
+ return version == null ? "" : versionMapping.mapVersion(version);
+ }
+
+ public Version getVersion(final String id) {
+ if (id.equals("")) {
+ return null;
+ }
+ return versionMapping.getVersion(id);
+ }
+
+ // ////////////////////////////
+ // Debug
+ // ////////////////////////////
+ public void append(final DebugBuilder debug) {
+ debug.startSection("Scimpi Request");
+
+ debug.appendTitle("User");
+ final AuthenticationSession session = getSession();
+ debug.appendln("Authentication Session", session);
+ if (session != null) {
+ debug.appendln("Name", session.getUserName());
+ debug.appendln("Roles", session.getRoles());
+ }
+
+ debug.appendTitle("context");
+ debug.appendln("Parent request path", requestedParentPath);
+ debug.appendln("Requested file", requestedFile);
+ debug.appendln("Parent resource path", resourceParentPath);
+ debug.appendln("Resource file", resourceFile);
+ debug.endSection();
+
+ debug.startSection("Variables");
+ append(debug, Scope.GLOBAL);
+ append(debug, Scope.SESSION);
+ append(debug, Scope.INTERACTION);
+ append(debug, Scope.REQUEST);
+ append(debug, Scope.ERROR);
+ debug.endSection();
+
+ debug.startSection("Object Mapping");
+ objectMapping.append(debug);
+ debug.endSection();
+ }
+
+ private void append(final DebugBuilder view, final Scope scope) {
+ final Map<String, Object> map = variables.get(scope);
+ final Iterator<String> keys = new TreeSet<String>(map.keySet()).iterator();
+ if (keys.hasNext()) {
+ view.appendTitle(scope + " scoped variables");
+ while (keys.hasNext()) {
+ final String key = keys.next();
+ final Object object = map.get(key);
+ final String mappedTo = "";
+ view.appendln(key, object + mappedTo);
+ }
+ }
+ }
+
+ public void append(final DebugBuilder debug, final String list) {
+ if (list.equals("variables")) {
+ appendVariables(debug, Scope.GLOBAL);
+ appendVariables(debug, Scope.SESSION);
+ appendVariables(debug, Scope.INTERACTION);
+ appendVariables(debug, Scope.REQUEST);
+ appendVariables(debug, Scope.ERROR);
+ } else if (list.equals("mappings")) {
+ objectMapping.appendMappings(debug);
+ }
+ }
+
+ private void appendVariables(final DebugBuilder debug, final Scope scope) {
+ final Map<String, Object> map = variables.get(scope);
+ final Iterator<String> names = new TreeSet(map.keySet()).iterator();
+ if (names.hasNext()) {
+ debug.startSection(scope.toString());
+ while (names.hasNext()) {
+ final String name = names.next();
+ try {
+ final Object object = map.get(name);
+ String details = "";
+ if (object instanceof String) {
+ final ObjectAdapter mappedObject = mappedObject((String) object);
+ if (mappedObject != null) {
+ details = mappedObject.toString();
+ }
+ }
+ debug.appendln(name, object + " " + details);
+ } catch (final Exception e) {
+ debug.appendln(name, map.get(name));
+ }
+ }
+ debug.endSection();
+ }
+ }
+
+ public List<String> getDebugUsers() {
+ return debugUsers.getNames();
+ }
+
+ // ////////////////////////////
+ // Variables
+ // ////////////////////////////
+
+ public void clearVariables(final Scope scope) {
+ variables.get(scope).clear();
+ }
+
+ public void changeScope(final String name, final Scope newScope) {
+ for (final Scope element : SCOPES) {
+ final Map<String, Object> map = variables.get(element);
+ final Object object = map.get(name);
+ if (object != null) {
+ map.remove(name);
+ addVariable(name, object, newScope);
+ return;
+ }
+ }
+ }
+
+ public void clearVariable(String name, final Scope scope) {
+ name = name != null ? name : RESULT;
+ variables.get(scope).remove(name);
+ }
+
+ public void addVariable(final String name, final Object value, final String scope) {
+ addVariable(name, value, scope(scope));
+ }
+
+ public void addVariable(String name, final Object value, final Scope scope) {
+ name = name != null ? name : RESULT;
+ if (scope == Scope.SESSION && value != null && !(value instanceof Serializable)) {
+ throw new ScimpiException("SESSION scoped variable (" + name + ") must be serializable: " + value);
+ }
+ removeExistingVariable(name);
+ variables.get(scope).put(name, value);
+ }
+
+ private void removeExistingVariable(final String name) {
+ for (final Scope element : SCOPES) {
+ final Map<String, Object> map = variables.get(element);
+ final Object object = map.get(name);
+ if (object != null) {
+ map.remove(name);
+ break;
+ }
+ }
+ }
+
+ public String getStringVariable(final String name) {
+ final String value = (String) getVariable(name);
+ if (value == null) {
+ return null;
+ } else {
+ return replaceVariables(value);
+ }
+ }
+
+ public Object getVariable(final String name) {
+ for (final Scope element : SCOPES) {
+ final Map<String, Object> map = variables.get(element);
+ final Object object = map.get(name);
+ if (object != null) {
+ return object;
+ }
+ }
+ return null;
+ }
+
+ public String replaceVariables(String value) {
+ final int start = value.indexOf("${");
+ if (start == -1) {
+ return value;
+ } else {
+ final int end = value.indexOf('}');
+ if (end == -1) {
+ throw new PropertyException("No closing brace in " + value.substring(start));
+ } else if (end < start) {
+ throw new PropertyException("Closing brace before opening brace in " + value.substring(end));
+ }
+ final String name = value.substring(start + 2, end);
+ if (name != null) {
+ final int pos = name.indexOf(":");
+ final String variableName = pos == -1 ? name : name.substring(0, pos);
+ final String qualifier = pos == -1 ? "none" : name.substring(pos);
+ Object replacementValue;
+ final boolean embed = qualifier.indexOf("embed") > -1;
+ if (embed) {
+ replacementValue = "${" + variableName + "}";
+ } else {
+ replacementValue = getParameter(variableName);
+ if (replacementValue == null) {
+ replacementValue = getVariable(variableName);
+ }
+ if (replacementValue == null) {
+ replacementValue = getBuiltIn(variableName);
+ }
+
+ if (replacementValue == null) {
+ final boolean ensureExists = qualifier.indexOf("optional") == -1;
+ if (ensureExists) {
+ throw new PropertyException("No value for the variable " + value.substring(start, end + 1));
+ } else {
+ replacementValue = "";
+ }
+ }
+ }
+ final boolean repeat = qualifier.indexOf("repeat") > -1;
+ if (repeat) {
+ value = value.substring(0, start) + replacementValue + value.substring(end + 1);
+ return replaceVariables(value);
+ } else {
+ final String remainder = replaceVariables(value.substring(end + 1));
+ value = value.substring(0, start) + replacementValue + remainder;
+ return value;
+ }
+
+ } else {
+ throw new PropertyException("No variable name speceified");
+ }
+ }
+ }
+
+ private Object getBuiltIn(final String name) {
+ if (name.equals("_session")) {
+ return getSessionId();
+ } else if (name.equals("_context")) {
+ return getContextPath();
+ } else if (name.equals("_this")) {
+ return resourceFile;
+ } else if (name.equals("_directory")) {
+ return resourceParentPath;
+ } else if (name.equals("_base")) {
+ return getUrlBase() + getContextPath() + resourceParentPath + resourceFile;
+ // return "http://localhost:8080" + resourceParentPath +
+ // resourceFile;
+ }
+ return null;
+ }
+
+ public String encodedInteractionParameters() {
+ final StringBuffer buffer = new StringBuffer();
+ final Map<String, Object> map = variables.get(Scope.INTERACTION);
+ final Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
+ while (iterator.hasNext()) {
+ final Entry<String, Object> entry = iterator.next();
+ buffer.append("&" + entry.getKey() + "=" + entry.getValue());
+ }
+ return buffer.toString();
+ }
+
+ public String interactionFields() {
+ final StringBuffer buffer = new StringBuffer();
+ final Map<String, Object> map = variables.get(Scope.INTERACTION);
+ final Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
+ while (iterator.hasNext()) {
+ final Entry<String, Object> entry = iterator.next();
+ buffer.append("<input type=\"hidden\" name=\"" + entry.getKey() + "\" value=\"" + entry.getValue() + "\" />\n");
+ }
+ return buffer.toString();
+ }
+
+ protected abstract String getSessionId();
+
+ public abstract void addCookie(String name, String value, int minutesUtilExpires);
+
+ public abstract String getCookie(String name);
+
+
+
+ // /////////////////////////////////////////////////
+ // Start/end request
+ // /////////////////////////////////////////////////
+
+ public void endRequest() throws IOException {
+ getWriter().close();
+ objectMapping.clear();
+ variables.get(Scope.ERROR).clear();
+ variables.get(Scope.REQUEST).clear();
+ variables.get(Scope.INTERACTION).clear();
+ }
+
+ public void startRequest() {
+ debugTrace.setLength(0);
+ objectMapping.reloadIdentityMap();
+ final String debugParameter = getParameter("debug");
+ if (debugParameter != null) {
+ if (debugParameter.equals("off")) {
+ debug = Debug.OFF;
+ } else if (debugParameter.equals("on")) {
+ debug = Debug.ON;
+ } else if (debugParameter.equals("page")) {
+ debug = Debug.PAGE;
+ }
+ }
+ }
+
+ public abstract PrintWriter getWriter();
+
+ // /////////////////////////////
+ // Forwarding
+ // /////////////////////////////
+ public void forwardTo(final String forwardTo) {
+ this.forwardTo = "/" + forwardTo;
+ }
+
+ public String forwardTo() {
+ final String returnForwardTo = forwardTo;
+ forwardTo = null;
+ return returnForwardTo;
+ }
+
+ // /////////////////////////////
+ // Parameters
+ // /////////////////////////////
+ public void addParameter(final String name, final String parameter) {
+ if (name == null) {
+ throw new ScimpiException("Name must be specified for parameter " + parameter);
+ }
+ addVariable(name, parameter, Scope.REQUEST);
+ }
+
+ public String getParameter(final String name) {
+ final Object variable = getVariable(name);
+ if (variable instanceof String || variable == null) {
+ return (String) variable;
+ } else {
+ return variable.toString();
+ }
+ }
+
+ public Iterator<Entry<String, Object>> interactionParameters() {
+ final Map<String, Object> map = variables.get(Scope.REQUEST);
+ final Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
+ return iterator;
+ }
+
+ // ///////////////////////////////////////
+ // Requested file
+ // ///////////////////////////////////////
+
+ /**
+ * The requested file is the file that the browser requested. This may or
+ * may not be the file that is actually processed and returned; that is the
+ * {@link #getResourceFile()}.
+ */
+ public String getRequestedFile() {
+ return requestedFile;
+ }
+
+ public void setRequestPath(final String filePath) {
+ setRequestPath(filePath, null);
+ }
+
+ public void setRequestPath(final String filePath, String defaultGenericPath) {
+ if (filePath == null) {
+ defaultGenericPath = defaultGenericPath == null ? "" : defaultGenericPath;
+ this.requestedFile = Dispatcher.GENERIC + defaultGenericPath + "." + Dispatcher.EXTENSION;
+ } else if (filePath.startsWith("_generic")) {
+ this.requestedParentPath = "/";
+ LOG.debug("generic file, requested path cleared");
+ this.requestedFile = filePath;
+ LOG.debug("requested file set = " + filePath);
+
+ } else {
+ final int lastSlash = filePath.lastIndexOf('/');
+ if (lastSlash == -1) {
+ throw new ScimpiException("No slash in request path: " + filePath);
+ }
+ final String path = filePath.substring(0, lastSlash + 1);
+ LOG.debug("requested path set = " + path);
+ this.requestedParentPath = path;
+
+ final String file = filePath.substring(lastSlash + 1);
+ LOG.debug("requested file set = " + file);
+ this.requestedFile = file;
+ }
+ }
+
+ public void clearRequestedPath() {
+ this.requestedParentPath = null;
+ this.requestedFile = null;
+ }
+
+ /**
+ * Returns the absolute file system path to the specified resource based on
+ * the path used for the current request during the call to
+ * {@link #setRequestPath(String)}. The return path can then be used to
+ * access the specified resource. If the resource has a leading slash (/)
+ * then that resource string is returned as the path.
+ */
+ public String requestedFilePath(final String resource) {
+ if (resource.startsWith("/")) {
+ return resource;
+ } else {
+ return requestedParentPath + resource;
+ }
+ }
+
+ // ///////////////////////////////////////
+ // Resource file
+ // ///////////////////////////////////////
+
+ /**
+ * The resource file is the file on disk that is processed and returned to
+ * the browser. This may or may not be the file that was actually requested
+ * by the browser; that is the {@link #getRequestedFile()}.
+ */
+ public String getResourceFile() {
+ return resourceFile;
+ }
+
+ public String getResourceParentPath() {
+ return resourceParentPath;
+ }
+
+ public void setResourcePath(final String filePath) {
+ if (filePath == null) {
+ throw new ScimpiException("Path must be specified");
+ } else {
+ final int lastSlash = filePath.lastIndexOf('/');
+ if (lastSlash == -1) {
+ throw new ScimpiException("No slash in request path: " + filePath);
+ }
+ final String path = /* getContextPath() + */filePath.substring(0, lastSlash + 1);
+ LOG.debug("resource path set = " + path);
+ this.resourceParentPath = path;
+
+ final String file = filePath.substring(lastSlash + 1);
+ LOG.debug("resource file set = " + file);
+ this.resourceFile = file;
+ }
+ }
+
+ /**
+ * Returns a uri for the specified resource based on the path used for the
+ * current request (as set up during the call to
+ * {@link #setResourcePath(String)}). Such a uri when used by the browser
+ * will allow access to the specified resource. If the resource has a
+ * leading slash (/) or the resource is for a generic page (starts with
+ * "_generic") then that resource string is returned as the path.
+ */
+ public String fullUriPath(final String resource) {
+ if (resource.startsWith("/") || resource.startsWith("_generic")) {
+ return resource;
+ } else {
+ return getContextPath() + resourceParentPath + resource;
+ }
+ }
+
+ /**
+ * Returns the absolute file system path to the specified resource based on
+ * the path used for the current request (as set up during the call to
+ * {@link #setResourcePath(String)}). The return path can then be used to
+ * access the specified resource. If the resource has a leading slash (/) or
+ * the resource is for a generic page (starts with "_generic") then that
+ * resource string is returned as the path.
+ */
+ public String fullFilePath(final String resource) {
+ if (resource.startsWith("/") || resource.startsWith("_generic")) {
+ return resource;
+ } else {
+ return resourceParentPath + resource;
+ }
+ }
+
+ // //////////////////////////////////////////////////////////////////
+ //
+ // //////////////////////////////////////////////////////////////////
+
+ public String mapObject(final ObjectAdapter object, final Scope scope) {
+ if (object.isValue()) {
+ return object.titleString();
+ } else if (scope == Scope.INTERACTION && object.isTransient()) {
+ return objectMapping.mapTransientObject(object);
+ } else if (object.getOid() != null) {
+ return objectMapping.mapObject(object, scope);
+ } else {
+ collection = object;
+ return "collection";
+ }
+ }
+
+ public void unmapObject(final ObjectAdapter object, final Scope scope) {
+ objectMapping.unmapObject(object, scope);
+ }
+
+ public abstract String findFile(String fileName);
+
+ public abstract InputStream openStream(String path);
+
+ public abstract String imagePath(ObjectAdapter object);
+
+ public abstract String imagePath(ObjectSpecification specification);
+
+ public abstract void forward(String view);
+
+ public abstract void redirectTo(String view);
+
+ public abstract String getContextPath();
+
+ public abstract String getUrlBase();
+
+ public abstract String getHeader(String name);
+
+ public abstract String getQueryString();
+
+ public abstract void startHttpSession();
+
+ public abstract String clearSession();
+
+ public abstract boolean isAborted();
+
+ public abstract String getErrorReference();
+
+ public abstract String getErrorMessage();
+
+ public abstract String getErrorDetails();
+
+ public void setSession(final AuthenticationSession session) {
+ this.session = session;
+ addVariable("_auth_session", session, Scope.SESSION);
+ }
+
+ public AuthenticationSession getSession() {
+ return session;
+ }
+
+ public abstract String getUri();
+
+ public void raiseError(final int status, final ErrorCollator errorDetails) {
+ }
+
+ public void setContentType(final String string) {
+ }
+
+ public void setSessionData(final Map<String, Object> hashMap) {
+ variables.put(Scope.SESSION, hashMap);
+ session = (AuthenticationSession) getVariable("_auth_session");
+ Boolean authenticated = (Boolean) getVariable("_authenticated");
+ isUserAuthenticated = authenticated != null && authenticated.booleanValue();
+ }
+
+ public Map<String, Object> getSessionData() {
+ return variables.get(Scope.SESSION);
+ }
+
+ public Debug getDebug() {
+ return debug;
+ }
+
+ public boolean isDebugDisabled() {
+ return !debugUsers.isDebugEnabled(getSession());
+ }
+
+ public boolean isDebug() {
+ return getDebug() == Debug.ON;
+ }
+
+ public boolean showDebugData() {
+ final Boolean variable = (Boolean) getVariable("debug-on");
+ return variable != null && variable.booleanValue();
+ }
+
+ public String getDebugTrace() {
+ return debugTrace.toString().replace('<', '[').replace('>', ']');
+ }
+
+ public void appendDebugTrace(final String line) {
+ debugTrace.append(line);
+ }
+
+ public void clearTransientVariables() {
+ objectMapping.endSession();
+ }
+
+ public void reset() {
+ }
+
+ public boolean isUserAuthenticated() {
+ return isUserAuthenticated;
+ }
+
+ public void setUserAuthenticated(boolean isUserAuthenticated) {
+ this.isUserAuthenticated = isUserAuthenticated;
+ addVariable("_authenticated", isUserAuthenticated, Scope.SESSION);
+ }
+
+
+ protected PersistenceSession getPersistenceSession() {
+ return IsisContext.getPersistenceSession();
+ }
+
+ protected OidMarshaller getOidMarshaller() {
+ return oidMarshaller;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/VersionMapping.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/VersionMapping.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/VersionMapping.java
new file mode 100644
index 0000000..0ce8645
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/VersionMapping.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.context;
+
+import org.apache.isis.core.metamodel.adapter.version.Version;
+
+public interface VersionMapping {
+
+ String mapVersion(Version version);
+
+ Version getVersion(String id);
+
+}
[32/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.js b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.js
new file mode 100644
index 0000000..b09e097
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.js
@@ -0,0 +1,3153 @@
+(function() {
+ "Alchemy.js is a graph drawing application for the web.\nCopyright (C) 2014 GraphAlchemist, Inc.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\nlets";
+ var Alchemy, Clustering, DrawEdge, DrawEdges, DrawNode, DrawNodes, Editor, EditorInteractions, EditorUtils, Layout, root, warnings,
+ __slice = [].slice,
+ __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+
+ Alchemy = (function() {
+ function Alchemy(userConf) {
+ if (userConf == null) {
+ userConf = null;
+ }
+ this.a = this;
+ this.version = "0.4.1";
+ this.get = new this.Get(this);
+ this.remove = new this.Remove(this);
+ this.create = new this.Create(this);
+ this.set = new this.Set(this);
+ this.drawing = {
+ DrawEdge: DrawEdge(this),
+ DrawEdges: DrawEdges(this),
+ DrawNode: DrawNode(this),
+ DrawNodes: DrawNodes(this),
+ EdgeUtils: this.EdgeUtils(this),
+ NodeUtils: this.NodeUtils(this)
+ };
+ this.controlDash = this.controlDash(this);
+ this.stats = this.stats(this);
+ this.layout = Layout;
+ this.clustering = Clustering;
+ this.models = {
+ Node: this.Node(this),
+ Edge: this.Edge(this)
+ };
+ this.utils = {
+ warnings: new warnings(this)
+ };
+ this.filters = this.filters(this);
+ this.exports = this.exports(this);
+ this.visControls = {};
+ this.styles = {};
+ this.editor = {};
+ this.log = {};
+ this.state = {
+ "interactions": "default",
+ "layout": "default"
+ };
+ this.startGraph = this.startGraph(this);
+ this.updateGraph = this.updateGraph(this);
+ this.generateLayout = this.generateLayout(this);
+ this.svgStyles = this.svgStyles(this);
+ this.interactions = this.interactions(this);
+ this.search = this.search(this);
+ this.plugins = this.plugins(this);
+ this._nodes = {};
+ this._edges = {};
+ this.getNodes = this.get.getNodes;
+ this.getEdges = this.get.getEdges;
+ this.allNodes = this.get.allNodes;
+ this.allEdges = this.get.allEdges;
+ if (userConf) {
+ this.begin(userConf);
+ }
+ }
+
+ Alchemy.prototype.begin = function(userConf) {
+ var conf;
+ conf = this.setConf(userConf);
+ switch (typeof this.conf.dataSource) {
+ case 'string':
+ d3.json(this.a.conf.dataSource, this.a.startGraph);
+ break;
+ case 'object':
+ this.a.startGraph(this.a.conf.dataSource);
+ }
+ this.plugins.init();
+ Alchemy.prototype.instances.push(this);
+ return this;
+ };
+
+ Alchemy.prototype.setConf = function(userConf) {
+ var key, val;
+ if (userConf.theme != null) {
+ userConf = _.merge(_.cloneDeep(this.defaults), this.a.themes["" + userConf.theme]);
+ }
+ for (key in userConf) {
+ val = userConf[key];
+ switch (key) {
+ case "clusterColors":
+ userConf["clusterColours"] = val;
+ break;
+ case "backgroundColor":
+ userConf["backgroundColour"] = val;
+ break;
+ case "nodeColor":
+ userConf[nodeColour] = val;
+ }
+ }
+ return this.a.conf = _.merge(_.cloneDeep(this.defaults), userConf);
+ };
+
+ Alchemy.prototype.instances = [];
+
+ Alchemy.prototype.getInst = function(svg) {
+ var instNumber;
+ instNumber = parseInt(d3.select(svg).attr("alchInst"));
+ return Alchemy.prototype.instances[instNumber];
+ };
+
+ return Alchemy;
+
+ })();
+
+ root = typeof exports !== "undefined" && exports !== null ? exports : this;
+
+ root.Alchemy = Alchemy;
+
+ root.alchemy = {
+ begin: function(config) {
+ return root.alchemy = new Alchemy(config);
+ }
+ };
+
+ Alchemy.prototype.Create = (function() {
+ function Create(instance) {
+ this.a = instance;
+ }
+
+ Create.prototype.nodes = function() {
+ var a, n, nodeMap, nodeMaps, registerNode, _i, _len;
+ nodeMap = arguments[0], nodeMaps = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ a = this.a;
+ registerNode = function(node) {
+ var aNode;
+ if (!a._nodes[node.id]) {
+ aNode = new a.models.Node(node);
+ a._nodes[node.id] = aNode;
+ return [aNode];
+ } else {
+ return console.warn("A node with the id " + node.id + " already exists.\nConsider using the @a.get.nodes() method to \nretrieve the node and then using the Node methods.");
+ }
+ };
+ nodeMaps = _.union(nodeMaps, nodeMap);
+ for (_i = 0, _len = nodeMaps.length; _i < _len; _i++) {
+ n = nodeMaps[_i];
+ registerNode(n);
+ }
+ if (this.a.initial) {
+ return this.a.updateGraph();
+ }
+ };
+
+ Create.prototype.edges = function() {
+ var a, allEdges, edgeMap, edgeMaps, registerEdge;
+ edgeMap = arguments[0], edgeMaps = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ a = this.a;
+ registerEdge = function(edge) {
+ var aEdge, edgeArray;
+ if (edge.id && !a._edges[edge.id]) {
+ aEdge = new a.models.Edge(edge);
+ a._edges[edge.id] = [aEdge];
+ return [aEdge];
+ } else if (edge.id && a._edges[edge.id]) {
+ return console.warn("An edge with that id " + someEdgeMap.id + " already exists.\nConsider using the @a.get.edge() method to \nretrieve the edge and then using the Edge methods.\nNote: id's are not required for edges. Alchemy will create\nan unlimited number of edges for the same source and target node.\nSimply omit 'id' when creating the edge.");
+ } else {
+ edgeArray = a._edges["" + edge.source + "-" + edge.target];
+ if (edgeArray) {
+ aEdge = new a.models.Edge(edge, edgeArray.length);
+ edgeArray.push(aEdge);
+ return [aEdge];
+ } else {
+ aEdge = new a.models.Edge(edge, 0);
+ a._edges["" + edge.source + "-" + edge.target] = [aEdge];
+ return [aEdge];
+ }
+ }
+ };
+ allEdges = _.uniq(_.flatten(arguments));
+ _.each(allEdges, function(e) {
+ return registerEdge(e);
+ });
+ if (this.a.initial) {
+ return this.a.updateGraph();
+ }
+ };
+
+ return Create;
+
+ })();
+
+ Alchemy.prototype.Get = function(instance) {
+ return {
+ a: instance,
+ _el: [],
+ _elType: null,
+ _makeChain: function(inp) {
+ var returnedGet;
+ returnedGet = this;
+ returnedGet.__proto__ = [].__proto__;
+ while (returnedGet.length) {
+ returnedGet.pop();
+ }
+ _.each(inp, function(e) {
+ return returnedGet.push(e);
+ });
+ return returnedGet;
+ },
+ nodes: function() {
+ var a, allIDs, id, ids, nodeList;
+ id = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ if (id != null) {
+ allIDs = _.map(arguments, function(arg) {
+ return String(arg);
+ });
+ a = this.a;
+ nodeList = (function(a) {
+ return _.filter(a._nodes, function(val, key) {
+ if (_.contains(allIDs, key)) {
+ return val;
+ }
+ });
+ })(a);
+ }
+ this._elType = "node";
+ this._el = nodeList;
+ return this._makeChain(nodeList);
+ },
+ edges: function() {
+ var a, allIDs, edgeList, id, ids;
+ id = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ if (id != null) {
+ allIDs = _.map(arguments, function(arg) {
+ return String(arg);
+ });
+ a = this.a;
+ edgeList = (function(a) {
+ return _.flatten(_.filter(a._edges, function(val, key) {
+ if (_.contains(allIDs, key)) {
+ return val;
+ }
+ }));
+ })(a);
+ }
+ this._elType = "edge";
+ this._el = edgeList;
+ return this._makeChain(edgeList);
+ },
+ all: function() {
+ var a, elType;
+ a = this.a;
+ elType = this._elType;
+ this._el = (function(elType) {
+ switch (elType) {
+ case "node":
+ return a.elements.nodes.val;
+ case "edge":
+ return a.elements.edges.flat;
+ }
+ })(elType);
+ return this._makeChain(this._el);
+ },
+ elState: function(state) {
+ var elList;
+ elList = _.filter(this._el, function(e) {
+ return e._state === state;
+ });
+ this._el = elList;
+ return this._makeChain(elList);
+ },
+ state: function(key) {
+ if (this.a.state.key != null) {
+ return this.a.state.key;
+ }
+ },
+ type: function(type) {
+ var elList;
+ elList = _.filter(this._el, function(e) {
+ return e._nodeType === type || e._edgeType === type;
+ });
+ this._el = elList;
+ return this._makeChain(elList);
+ },
+ activeNodes: function() {
+ return _.filter(this.a._nodes, function(node) {
+ if (node._state === "active") {
+ return node;
+ }
+ });
+ },
+ activeEdges: function() {
+ return _.filter(this.a.get.allEdges(), function(edge) {
+ if (edge._state === "active") {
+ return edge;
+ }
+ });
+ },
+ state: function(key) {
+ if (this.a.state.key != null) {
+ return this.a.state.key;
+ }
+ },
+ clusters: function() {
+ var clusterMap, nodesByCluster;
+ clusterMap = this.a.layout._clustering.clusterMap;
+ nodesByCluster = {};
+ _.each(clusterMap, function(key, value) {
+ return nodesByCluster[value] = _.select(this.a.get.allNodes(), function(node) {
+ return node.getProperties()[this.a.conf.clusterKey] === value;
+ });
+ });
+ return nodesByCluster;
+ },
+ clusterColours: function() {
+ var clusterColoursObject, clusterMap;
+ clusterMap = this.a.layout._clustering.clusterMap;
+ clusterColoursObject = {};
+ _.each(clusterMap, function(key, value) {
+ return clusterColoursObject[value] = this.a.conf.clusterColours[key % this.a.conf.clusterColours.length];
+ });
+ return clusterColoursObject;
+ },
+ allEdges: function() {
+ return this.a.elements.nodes.flat;
+ },
+ allNodes: function(type) {
+ if (type != null) {
+ return _.filter(this.a._nodes, function(n) {
+ if (n._nodeType === type) {
+ return n;
+ }
+ });
+ } else {
+ return this.a.elements.nodes.val;
+ }
+ },
+ getNodes: function() {
+ var a, id, ids;
+ id = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ a = this.a;
+ ids.push(id);
+ return _.map(ids, function(id) {
+ return a._nodes[id];
+ });
+ },
+ getEdges: function(id, target) {
+ var a, edge_id;
+ if (id == null) {
+ id = null;
+ }
+ if (target == null) {
+ target = null;
+ }
+ a = this.a;
+ if ((id != null) && (target != null)) {
+ edge_id = "" + id + "-" + target;
+ return this.a._edges[edge_id];
+ } else if ((id != null) && (target == null)) {
+ return this.a._nodes[id]._adjacentEdges;
+ }
+ }
+ };
+ };
+
+ Alchemy.prototype.Remove = (function() {
+ function Remove(instance) {
+ this.a = instance;
+ }
+
+ Remove.prototype.nodes = function(nodeMap) {
+ return _.each(nodeMap, function(n) {
+ if (n._nodeType != null) {
+ return n.remove();
+ }
+ });
+ };
+
+ Remove.prototype.edges = function(edgeMap) {
+ return _.each(edgeMap, function(e) {
+ if (e._edgeType != null) {
+ return e.remove();
+ }
+ });
+ };
+
+ return Remove;
+
+ })();
+
+ Alchemy.prototype.Set = function(instance) {
+ return {
+ a: instance,
+ state: function(key, value) {
+ return this.a.state.key = value;
+ }
+ };
+ };
+
+ Clustering = (function() {
+ function Clustering(instance) {
+ var clustering, conf, nodes, _charge, _friction, _gravity, _linkDistancefn, _linkStrength;
+ this.a = instance;
+ nodes = this.a._nodes;
+ conf = this.a.conf;
+ clustering = this;
+ this.clusterKey = conf.clusterKey;
+ this.identifyClusters(this.a);
+ _charge = -500;
+ _linkStrength = function(edge) {
+ var sourceCluster, targetCluster;
+ sourceCluster = nodes[edge.source.id]._properties[this.clusterKey];
+ targetCluster = nodes[edge.target.id]._properties[this.clusterKey];
+ if (sourceCluster === targetCluster) {
+ return 0.15;
+ } else {
+ return 0;
+ }
+ };
+ _friction = function() {
+ return 0.7;
+ };
+ _linkDistancefn = function(edge) {
+ nodes = edge.self.a._nodes;
+ if (nodes[edge.source.id]._properties.root || nodes[edge.target.id]._properties.root) {
+ return 300;
+ } else if (nodes[edge.source.id]._properties[this.clusterKey] === nodes[edge.target.id]._properties[this.clusterKey]) {
+ return 10;
+ } else {
+ return 600;
+ }
+ };
+ _gravity = function(k) {
+ return 8 * k;
+ };
+ this.layout = {
+ charge: _charge,
+ linkStrength: function(edge) {
+ return _linkStrength(edge);
+ },
+ friction: function() {
+ return _friction();
+ },
+ linkDistancefn: function(edge) {
+ return _linkDistancefn(edge);
+ },
+ gravity: function(k) {
+ return _gravity(k);
+ }
+ };
+ }
+
+ Clustering.prototype.identifyClusters = function(a) {
+ var clusters, nodes, _i, _ref, _results;
+ nodes = a.elements.nodes.val;
+ clusters = _.uniq(_.map(nodes, function(node) {
+ return node.getProperties()[a.conf.clusterKey];
+ }));
+ return this.clusterMap = _.zipObject(clusters, (function() {
+ _results = [];
+ for (var _i = 0, _ref = clusters.length; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
+ return _results;
+ }).apply(this));
+ };
+
+ Clustering.prototype.getClusterColour = function(clusterValue) {
+ var index;
+ index = this.clusterMap[clusterValue] % this.a.conf.clusterColours.length;
+ return this.a.conf.clusterColours[index];
+ };
+
+ Clustering.prototype.edgeGradient = function(edges) {
+ var Q, defs, edge, endColour, gradient, gradient_id, id, ids, nodes, startColour, _i, _len, _ref, _results;
+ defs = this.a.vis.select("" + this.a.conf.divSelector + " svg");
+ Q = {};
+ nodes = this.a._nodes;
+ _ref = _.map(edges, function(edge) {
+ return edge._d3;
+ });
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ edge = _ref[_i];
+ if (nodes[edge.source.id]._properties.root || nodes[edge.target.id]._properties.root) {
+ continue;
+ }
+ if (nodes[edge.source.id]._properties[this.clusterKey] === nodes[edge.target.id]._properties[this.clusterKey]) {
+ continue;
+ }
+ if (nodes[edge.target.id]._properties[this.clusterKey] !== nodes[edge.source.id]._properties[this.clusterKey]) {
+ id = nodes[edge.source.id]._properties[this.clusterKey] + "-" + nodes[edge.target.id]._properties[this.clusterKey];
+ if (id in Q) {
+ continue;
+ } else if (!(id in Q)) {
+ startColour = this.getClusterColour(nodes[edge.target.id]._properties[this.clusterKey]);
+ endColour = this.getClusterColour(nodes[edge.source.id]._properties[this.clusterKey]);
+ Q[id] = {
+ 'startColour': startColour,
+ 'endColour': endColour
+ };
+ }
+ }
+ }
+ _results = [];
+ for (ids in Q) {
+ gradient_id = "cluster-gradient-" + ids;
+ gradient = defs.append("svg:linearGradient").attr("id", gradient_id);
+ gradient.append("svg:stop").attr("offset", "0%").attr("stop-color", Q[ids]['startColour']);
+ _results.push(gradient.append("svg:stop").attr("offset", "100%").attr("stop-color", Q[ids]['endColour']));
+ }
+ return _results;
+ };
+
+ return Clustering;
+
+ })();
+
+ Alchemy.prototype.clusterControls = {
+ init: function() {
+ var changeClusterHTML;
+ changeClusterHTML = "<input class='form-control form-inline' id='cluster-key' placeholder=\"Cluster Key\"></input>";
+ this.a.dash.select("#clustering-container").append("div").attr("id", "cluster-key-container").attr('class', 'property form-inline form-group').html(changeClusterHTML).style("display", "none");
+ this.a.dash.select("#cluster_control_header").on("click", function() {
+ var display, element;
+ element = this.a.dash.select("#cluster-key-container");
+ return display = element.style("display");
+ });
+ element.style("display", function(e) {
+ if (display === "block") {
+ return "none";
+ } else {
+ return "block";
+ }
+ });
+ if (this.a.dash.select("#cluster-key-container").style("display") === "none") {
+ this.a.dash.select("#cluster-arrow").attr("class", "fa fa-2x fa-caret-right");
+ } else {
+ this.a.dash.select("#cluster-arrow").attr("class", "fa fa-2x fa-caret-down");
+ }
+ return this.a.dash.select("#cluster-key").on("keydown", function() {
+ if (d3.event.keyIdentifier === "Enter") {
+ this.a.conf.cluster = true;
+ this.a.conf.clusterKey = this.value;
+ return this.a.generateLayout();
+ }
+ });
+ }
+ };
+
+ Alchemy.prototype.controlDash = function(instance) {
+ var a;
+ a = instance;
+ return {
+ init: function() {
+ var divSelector;
+ if (this.dashIsShown()) {
+ divSelector = a.conf.divSelector;
+ a.dash = d3.select("" + divSelector).append("div").attr("id", "control-dash-wrapper").attr("class", "col-md-4 initial");
+ a.dash.append("i").attr("id", "dash-toggle").attr("class", "fa fa-flask col-md-offset-12");
+ a.dash.append("div").attr("id", "control-dash").attr("class", "col-md-12");
+ a.dash.select('#dash-toggle').on('click', a.interactions.toggleControlDash);
+ a.controlDash.zoomCtrl();
+ a.controlDash.search();
+ a.controlDash.filters();
+ a.controlDash.stats();
+ a.controlDash.clustering();
+ return a.controlDash.exports();
+ }
+ },
+ search: function() {
+ if (a.conf.search) {
+ a.dash.select("#control-dash").append("div").attr("id", "search").html("<div class='input-group'>\n <input class='form-control' placeholder='Search'>\n <i class='input-group-addon search-icon'><span class='fa fa-search fa-1x'></span></i>\n</div> ");
+ return a.search.init();
+ }
+ },
+ zoomCtrl: function() {
+ if (a.conf.zoomControls) {
+ a.dash.select("#control-dash-wrapper").append("div").attr("id", "zoom-controls").attr("class", "col-md-offset-12").html("<button id='zoom-reset' class='btn btn-defualt btn-primary'><i class='fa fa-crosshairs fa-lg'></i></button> <button id='zoom-in' class='btn btn-defualt btn-primary'><i class='fa fa-plus'></i></button> <button id='zoom-out' class='btn btn-default btn-primary'><i class='fa fa-minus'></i></button>");
+ a.dash.select('#zoom-in').on("click", function() {
+ return a.interactions.clickZoom('in');
+ });
+ a.dash.select('#zoom-out').on("click", function() {
+ return a.interactions.clickZoom('out');
+ });
+ return a.dash.select('#zoom-reset').on("click", function() {
+ return a.interactions.clickZoom('reset');
+ });
+ }
+ },
+ filters: function() {
+ if (a.conf.nodeFilters || a.conf.edgeFilters) {
+ a.dash.select("#control-dash").append("div").attr("id", "filters");
+ return a.filters.init();
+ }
+ },
+ stats: function() {
+ var stats_html;
+ if (a.conf.nodeStats || a.conf.edgeStats) {
+ stats_html = "<div id = \"stats-header\" data-toggle=\"collapse\" data-target=\"#stats #all-stats\">\n<h3>\n Statistics\n</h3>\n<span class = \"fa fa-caret-right fa-2x\"></span>\n</div>\n<div id=\"all-stats\" class=\"collapse\">\n <ul class = \"list-group\" id=\"node-stats\"></ul>\n <ul class = \"list-group\" id=\"rel-stats\"></ul> \n</div>";
+ a.dash.select("#control-dash").append("div").attr("id", "stats").html(stats_html).select('#stats-header').on('click', function() {
+ if (a.dash.select('#all-stats').classed("in")) {
+ return a.dash.select("#stats-header>span").attr("class", "fa fa-2x fa-caret-right");
+ } else {
+ return a.dash.select("#stats-header>span").attr("class", "fa fa-2x fa-caret-down");
+ }
+ });
+ return a.stats.init();
+ }
+ },
+ exports: function() {
+ var exports_html;
+ if (a.conf.exportSVG) {
+ exports_html = "<div id=\"exports-header\" data-toggle=\"collapse\" data-target=\"#all-exports\" style=\"padding:10px;\">\n <h3>\n Exports\n </h3>\n <span class=\"fa fa-caret-right fa-2x\"></span>\n</div>\n<div id=\"all-exports\" class=\"collapse\"></div>";
+ a.dash.select("#control-dash").append("div").attr("id", "exports").attr("style", "padding: 0.5em 1em; border-bottom: thin dashed #E89619; color: white;").html(exports_html).select("#exports-header");
+ return a.exports.init();
+ }
+ },
+ clustering: function() {
+ var clusterControl_html;
+ if (a.conf.clusterControl) {
+ clusterControl_html = "<div id=\"clustering-container\">\n <div id=\"cluster_control_header\" data-toggle=\"collapse\" data-target=\"#clustering #cluster-options\">\n <h3>Clustering</h3>\n <span id=\"cluster-arrow\" class=\"fa fa-2x fa-caret-right\"></span>\n </div>\n</div>";
+ a.dash.select("#control-dash").append("div").attr("id", "clustering").html(clusterControl_html).select('#cluster_control_header');
+ return a.clusterControls.init();
+ }
+ },
+ dashIsShown: function() {
+ var conf;
+ conf = a.conf;
+ return conf.showEditor || conf.captionToggle || conf.toggleRootNodes || conf.removeElement || conf.clusterControl || conf.nodeStats || conf.edgeStats || conf.edgeFilters || conf.nodeFilters || conf.edgesToggle || conf.nodesToggle || conf.search || conf.exportSVG;
+ }
+ };
+ };
+
+ Alchemy.prototype.filters = (function(_this) {
+ return function(instance) {
+ var a;
+ a = instance;
+ return {
+ init: function() {
+ var caption, edgeType, edgeTypes, nodeKey, nodeType, nodeTypes, types, _i, _j, _len, _len1, _ref;
+ a.filters.show();
+ if (a.conf.edgeFilters) {
+ a.filters.showEdgeFilters();
+ }
+ if (a.conf.nodeFilters) {
+ a.filters.showNodeFilters();
+ }
+ if (a.conf.nodeTypes) {
+ nodeKey = Object.keys(a.conf.nodeTypes);
+ nodeTypes = '';
+ _ref = a.conf.nodeTypes[nodeKey];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ nodeType = _ref[_i];
+ caption = nodeType.replace('_', ' ');
+ nodeTypes += "<li class='list-group-item nodeType' role='menuitem' id='li-" + nodeType + "' name=" + nodeType + ">" + caption + "</li>";
+ }
+ a.dash.select('#node-dropdown').html(nodeTypes);
+ }
+ if (a.conf.edgeTypes) {
+ if (_.isPlainObject(a.conf.edgeTypes)) {
+ types = _.values(a.conf.edgeTypes)[0];
+ } else {
+ types = a.conf.edgeTypes;
+ }
+ edgeTypes = '';
+ for (_j = 0, _len1 = types.length; _j < _len1; _j++) {
+ edgeType = types[_j];
+ caption = edgeType.replace('_', ' ');
+ edgeTypes += "<li class='list-group-item edgeType' role='menuitem' id='li-" + edgeType + "' name=" + edgeType + ">" + caption + "</li>";
+ }
+ a.dash.select('#rel-dropdown').html(edgeTypes);
+ }
+ if (a.conf.captionsToggle) {
+ a.filters.captionsToggle();
+ }
+ if (a.conf.edgesToggle) {
+ a.filters.edgesToggle();
+ }
+ if (a.conf.nodesToggle) {
+ a.filters.nodesToggle();
+ }
+ return a.filters.update();
+ },
+ show: function() {
+ var filter_html;
+ filter_html = "<div id = \"filter-header\" data-toggle=\"collapse\" data-target=\"#filters form\">\n <h3>Filters</h3>\n <span class = \"fa fa-2x fa-caret-right\"></span>\n</div>\n <form class=\"form-inline collapse\">\n </form>";
+ a.dash.select('#control-dash #filters').html(filter_html);
+ a.dash.selectAll('#filter-header').on('click', function() {
+ if (a.dash.select('#filters>form').classed("in")) {
+ return a.dash.select("#filter-header>span").attr("class", "fa fa-2x fa-caret-right");
+ } else {
+ return a.dash.select("#filter-header>span").attr("class", "fa fa-2x fa-caret-down");
+ }
+ });
+ return a.dash.select('#filters form');
+ },
+ showEdgeFilters: function() {
+ var rel_filter_html;
+ rel_filter_html = "<div id=\"filter-rel-header\" data-target = \"#rel-dropdown\" data-toggle=\"collapse\">\n <h4>\n Edge Types\n </h4>\n <span class=\"fa fa-lg fa-caret-right\"></span>\n</div>\n<ul id=\"rel-dropdown\" class=\"collapse list-group\" role=\"menu\">\n</ul>";
+ a.dash.select('#filters form').append("div").attr("id", "filter-relationships").html(rel_filter_html);
+ return a.dash.select("#filter-rel-header").on('click', function() {
+ if (a.dash.select('#rel-dropdown').classed("in")) {
+ return a.dash.select("#filter-rel-header>span").attr("class", "fa fa-lg fa-caret-right");
+ } else {
+ return a.dash.select("#filter-rel-header>span").attr("class", "fa fa-lg fa-caret-down");
+ }
+ });
+ },
+ showNodeFilters: function() {
+ var node_filter_html;
+ node_filter_html = "<div id=\"filter-node-header\" data-target = \"#node-dropdown\" data-toggle=\"collapse\">\n <h4>\n Node Types\n </h4>\n <span class=\"fa fa-lg fa-caret-right\"></span>\n</div>\n<ul id=\"node-dropdown\" class=\"collapse list-group\" role=\"menu\">\n</ul>";
+ a.dash.select('#filters form').append("div").attr("id", "filter-nodes").html(node_filter_html);
+ return a.dash.select("#filter-node-header").on('click', function() {
+ if (a.dash.select('#node-dropdown').classed("in")) {
+ return a.dash.select("#filter-node-header>span").attr("class", "fa fa-lg fa-caret-right");
+ } else {
+ return a.dash.select("#filter-node-header>span").attr("class", "fa fa-lg fa-caret-down");
+ }
+ });
+ },
+ captionsToggle: function() {
+ return a.dash.select("#filters form").append("li").attr({
+ "id": "toggle-captions",
+ "class": "list-group-item active-label toggle"
+ }).html("Show Captions").on("click", function() {
+ var isDisplayed;
+ isDisplayed = a.dash.select("g text").attr("style");
+ if (isDisplayed === "display: block" || null) {
+ return a.dash.selectAll("g text").attr("style", "display: none");
+ } else {
+ return a.dash.selectAll("g text").attr("style", "display: block");
+ }
+ });
+ },
+ edgesToggle: function() {
+ return a.dash.select("#filters form").append("li").attr({
+ "id": "toggle-edges",
+ "class": "list-group-item active-label toggle"
+ }).html("Toggle Edges").on("click", function() {
+ if (_.contains(_.pluck(_.flatten(_.values(a._edges)), "_state"), "active")) {
+ return _.each(_.values(a._edges), function(edges) {
+ return _.each(edges, function(e) {
+ if (e._state === "active") {
+ return e.toggleHidden();
+ }
+ });
+ });
+ } else {
+ return _.each(_.values(a._edges), function(edges) {
+ return _.each(edges, function(e) {
+ var source, target;
+ source = a._nodes[e._properties.source];
+ target = a._nodes[e._properties.target];
+ if (source._state === "active" && target._state === "active") {
+ return e.toggleHidden();
+ }
+ });
+ });
+ }
+ });
+ },
+ nodesToggle: function() {
+ return a.dash.select("#filters form").append("li").attr({
+ "id": "toggle-nodes",
+ "class": "list-group-item active-label toggle"
+ }).html("Toggle Nodes").on("click", function() {
+ var nodes;
+ nodes = _.values(a._nodes);
+ if (_.contains(_.pluck(nodes, "_state"), "active")) {
+ return _.each(nodes, function(n) {
+ if (a.conf.toggleRootNodes && n._d3.root) {
+ return;
+ }
+ if (n._state === "active") {
+ return n.toggleHidden();
+ }
+ });
+ } else {
+ return _.each(_.values(a._nodes), function(n) {
+ if (a.conf.toggleRootNodes && n._d3.root) {
+ return;
+ }
+ return n.toggleHidden();
+ });
+ }
+ });
+ },
+ update: function() {
+ return a.dash.selectAll(".nodeType, .edgeType").on("click", function() {
+ var element, tag;
+ element = d3.select(this);
+ tag = element.attr("name");
+ a.vis.selectAll("." + tag).each(function(d) {
+ var edge, node, source, target;
+ if (a._nodes[d.id] != null) {
+ node = a._nodes[d.id];
+ return node.toggleHidden();
+ } else {
+ edge = a._edges[d.id][0];
+ source = a._nodes[edge._properties.source];
+ target = a._nodes[edge._properties.target];
+ if (source._state === "active" && target._state === "active") {
+ return edge.toggleHidden();
+ }
+ }
+ });
+ return a.stats.nodeStats();
+ });
+ }
+ };
+ };
+ })(this);
+
+ Alchemy.prototype.Index = function(instance, all) {
+ var a, edges, elements, nodes;
+ a = instance;
+ elements = {
+ nodes: {
+ val: (function() {
+ return _.values(a._nodes);
+ })()
+ },
+ edges: {
+ val: (function() {
+ return _.values(a._edges);
+ })()
+ }
+ };
+ nodes = elements.nodes;
+ edges = elements.edges;
+ elements.edges.flat = (function() {
+ return _.flatten(edges.val);
+ })();
+ elements.nodes.d3 = (function() {
+ return _.map(nodes.val, function(n) {
+ return n._d3;
+ });
+ })();
+ elements.edges.d3 = (function() {
+ return _.map(edges.flat, function(e) {
+ return e._d3;
+ });
+ })();
+ a.elements = elements;
+ return function() {
+ a.elements.nodes.svg = (function() {
+ return a.vis.selectAll('g.node');
+ })();
+ return a.elements.edges.svg = (function() {
+ return a.vis.selectAll('g.edge');
+ })();
+ };
+ };
+
+ Alchemy.prototype.interactions = function(instance) {
+ var a;
+ a = instance;
+ return {
+ edgeClick: function(d) {
+ var edge;
+ if (d3.event.defaultPrevented) {
+ return;
+ }
+ d3.event.stopPropagation();
+ edge = d.self;
+ if (typeof a.conf.edgeClick === 'function') {
+ a.conf.edgeClick(edge);
+ }
+ if (edge._state !== "hidden") {
+ edge._state = (function() {
+ if (edge._state === "selected") {
+ return "active";
+ }
+ return "selected";
+ })();
+ return edge.setStyles();
+ }
+ },
+ edgeMouseOver: function(d) {
+ var edge;
+ edge = d.self;
+ if (edge._state !== "hidden") {
+ if (edge._state !== "selected") {
+ edge._state = "highlighted";
+ }
+ return edge.setStyles();
+ }
+ },
+ edgeMouseOut: function(d) {
+ var edge;
+ edge = d.self;
+ if (edge._state !== "hidden") {
+ if (edge._state !== "selected") {
+ edge._state = "active";
+ }
+ return edge.setStyles();
+ }
+ },
+ nodeMouseOver: function(n) {
+ var node;
+ node = n.self;
+ if (node._state !== "hidden") {
+ if (node._state !== "selected") {
+ node._state = "highlighted";
+ node.setStyles();
+ }
+ if (typeof a.conf.nodeMouseOver === 'function') {
+ return a.conf.nodeMouseOver(node);
+ } else if (typeof a.conf.nodeMouseOver === ('number' || 'string')) {
+ return node.properties[a.conf.nodeMouseOver];
+ }
+ }
+ },
+ nodeMouseOut: function(n) {
+ var node;
+ node = n.self;
+ a = node.a;
+ if (node._state !== "hidden") {
+ if (node._state !== "selected") {
+ node._state = "active";
+ node.setStyles();
+ }
+ if ((a.conf.nodeMouseOut != null) && typeof a.conf.nodeMouseOut === 'function') {
+ return a.conf.nodeMouseOut(n);
+ }
+ }
+ },
+ nodeClick: function(n) {
+ var node;
+ if (d3.event.defaultPrevented) {
+ return;
+ }
+ d3.event.stopPropagation();
+ node = n.self;
+ if (typeof a.conf.nodeClick === 'function') {
+ a.conf.nodeClick(node);
+ }
+ if (node._state !== "hidden") {
+ node._state = (function() {
+ if (node._state === "selected") {
+ return "active";
+ }
+ return "selected";
+ })();
+ return node.setStyles();
+ }
+ },
+ zoom: function(extent) {
+ if (this._zoomBehavior == null) {
+ this._zoomBehavior = d3.behavior.zoom();
+ }
+ return this._zoomBehavior.scaleExtent(extent).on("zoom", function(d) {
+ a = Alchemy.prototype.getInst(this);
+ return a.vis.attr("transform", "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")");
+ });
+ },
+ clickZoom: function(direction) {
+ var scale, x, y, _ref;
+ _ref = a.vis.attr("transform").match(/(-*\d+\.*\d*)/g).map(function(a) {
+ return parseFloat(a);
+ }), x = _ref[0], y = _ref[1], scale = _ref[2];
+ a.vis.attr("transform", function() {
+ if (direction === "in") {
+ if (scale < a.conf.scaleExtent[1]) {
+ scale += 0.2;
+ }
+ return "translate(" + x + "," + y + ") scale(" + scale + ")";
+ } else if (direction === "out") {
+ if (scale > a.conf.scaleExtent[0]) {
+ scale -= 0.2;
+ }
+ return "translate(" + x + "," + y + ") scale(" + scale + ")";
+ } else if (direction === "reset") {
+ return "translate(0,0) scale(1)";
+ } else {
+ return console.log('error');
+ }
+ });
+ if (this._zoomBehavior == null) {
+ this._zoomBehavior = d3.behavior.zoom();
+ }
+ return this._zoomBehavior.scale(scale).translate([x, y]);
+ },
+ nodeDragStarted: function(d, i) {
+ d3.event.preventDefault;
+ d3.event.sourceEvent.stopPropagation();
+ d3.select(this).classed("dragging", true);
+ return d.fixed = true;
+ },
+ nodeDragged: function(d, i) {
+ var edges, node;
+ a = d.self.a;
+ d.x += d3.event.dx;
+ d.y += d3.event.dy;
+ d.px += d3.event.dx;
+ d.py += d3.event.dy;
+ node = d3.select(this);
+ node.attr("transform", "translate(" + d.x + ", " + d.y + ")");
+ edges = d.self._adjacentEdges;
+ return _.each(edges, function(edge) {
+ var selection;
+ selection = a.vis.select("#edge-" + edge.id + "-" + edge._index);
+ return a._drawEdges.updateEdge(selection.data()[0]);
+ });
+ },
+ nodeDragended: function(d, i) {
+ a = d.self.a;
+ d3.select(this).classed({
+ "dragging": false
+ });
+ if (!a.conf.forceLocked) {
+ return a.force.start();
+ }
+ },
+ nodeDoubleClick: function(d) {
+ return null;
+ },
+ deselectAll: function() {
+ var _ref;
+ a = Alchemy.prototype.getInst(this);
+ if ((_ref = d3.event) != null ? _ref.defaultPrevented : void 0) {
+ return;
+ }
+ if (a.conf.showEditor === true) {
+ a.modifyElements.nodeEditorClear();
+ }
+ _.each(a._nodes, function(n) {
+ n._state = "active";
+ return n.setStyles();
+ });
+ _.each(a._edges, function(edge) {
+ return _.each(edge, function(e) {
+ e._state = "active";
+ return e.setStyles();
+ });
+ });
+ if (a.conf.deselectAll && typeof (a.conf.deselectAll === 'function')) {
+ return a.conf.deselectAll();
+ }
+ }
+ };
+ };
+
+ Layout = (function() {
+ function Layout(instance) {
+ this.tick = __bind(this.tick, this);
+ this.linkStrength = __bind(this.linkStrength, this);
+ this.gravity = __bind(this.gravity, this);
+ var a, conf, nodes;
+ this.a = a = instance;
+ conf = this.a.conf;
+ nodes = this.a._nodes;
+ this.k = Math.sqrt(Math.log(_.size(this.a._nodes)) / (conf.graphWidth() * conf.graphHeight()));
+ this._clustering = new this.a.clustering(this.a);
+ this.d3NodeInternals = a.elements.nodes.d3;
+ if (conf.cluster) {
+ this._charge = function() {
+ return this._clustering.layout.charge;
+ };
+ this._linkStrength = function(edge) {
+ return this._clustering.layout.linkStrength(edge);
+ };
+ } else {
+ this._charge = function() {
+ return -10 / this.k;
+ };
+ this._linkStrength = function(edge) {
+ if (nodes[edge.source.id].getProperties('root') || nodes[edge.target.id].getProperties('root')) {
+ return 1;
+ } else {
+ return 0.9;
+ }
+ };
+ }
+ if (conf.cluster) {
+ this._linkDistancefn = function(edge) {
+ return this._clustering.layout.linkDistancefn(edge);
+ };
+ } else if (conf.linkDistancefn === 'default') {
+ this._linkDistancefn = function(edge) {
+ return 1 / (this.k * 50);
+ };
+ } else if (typeof conf.linkDistancefn === 'number') {
+ this._linkDistancefn = function(edge) {
+ return conf.linkDistancefn;
+ };
+ } else if (typeof conf.linkDistancefn === 'function') {
+ this._linkDistancefn = function(edge) {
+ return conf.linkDistancefn(edge);
+ };
+ }
+ }
+
+ Layout.prototype.gravity = function() {
+ if (this.a.conf.cluster) {
+ return this._clustering.layout.gravity(this.k);
+ } else {
+ return 50 * this.k;
+ }
+ };
+
+ Layout.prototype.linkStrength = function(edge) {
+ return this._linkStrength(edge);
+ };
+
+ Layout.prototype.friction = function() {
+ return 0.9;
+ };
+
+ Layout.prototype.collide = function(node) {
+ var conf, nx1, nx2, ny1, ny2, r;
+ conf = this.a.conf;
+ r = 2 * (node.radius + node['stroke-width']) + conf.nodeOverlap;
+ nx1 = node.x - r;
+ nx2 = node.x + r;
+ ny1 = node.y - r;
+ ny2 = node.y + r;
+ return function(quad, x1, y1, x2, y2) {
+ var l, x, y;
+ if (quad.point && (quad.point !== node)) {
+ x = node.x - Math.abs(quad.point.x);
+ y = node.y - quad.point.y;
+ l = Math.sqrt(x * x + y * y);
+ r = r;
+ if (l < r) {
+ l = (l - r) / l * conf.alpha;
+ node.x -= x *= l;
+ node.y -= y *= l;
+ quad.point.x += x;
+ quad.point.y += y;
+ }
+ }
+ return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
+ };
+ };
+
+ Layout.prototype.tick = function(draw) {
+ var a, edges, node, nodes, q, _i, _len, _ref;
+ a = this.a;
+ nodes = a.elements.nodes.svg;
+ edges = a.elements.edges.svg;
+ if (a.conf.collisionDetection) {
+ q = d3.geom.quadtree(this.d3NodeInternals);
+ _ref = this.d3NodeInternals;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ node = _ref[_i];
+ q.visit(this.collide(node));
+ }
+ }
+ nodes.attr("transform", function(d) {
+ return "translate(" + d.x + "," + d.y + ")";
+ });
+ this.drawEdge = a.drawing.DrawEdge;
+ this.drawEdge.styleText(edges);
+ return this.drawEdge.styleLink(edges);
+ };
+
+ Layout.prototype.positionRootNodes = function() {
+ var conf, container, i, n, rootNodes, _i, _len, _ref, _ref1, _results;
+ conf = this.a.conf;
+ container = {
+ width: conf.graphWidth(),
+ height: conf.graphHeight()
+ };
+ rootNodes = _.filter(this.a.elements.nodes.val, function(node) {
+ return node.getProperties('root');
+ });
+ if (rootNodes.length === 1) {
+ n = rootNodes[0];
+ _ref = [container.width / 2, container.width / 2], n._d3.x = _ref[0], n._d3.px = _ref[1];
+ _ref1 = [container.height / 2, container.height / 2], n._d3.y = _ref1[0], n._d3.py = _ref1[1];
+ n._d3.fixed = true;
+ } else {
+ _results = [];
+ for (i = _i = 0, _len = rootNodes.length; _i < _len; i = ++_i) {
+ n = rootNodes[i];
+ n._d3.x = container.width / Math.sqrt(rootNodes.length * (i + 1));
+ n._d3.y = container.height / 2;
+ _results.push(n._d3.fixed = true);
+ }
+ return _results;
+ }
+ };
+
+ Layout.prototype.chargeDistance = function() {
+ return 500;
+ };
+
+ Layout.prototype.linkDistancefn = function(edge) {
+ return this._linkDistancefn(edge);
+ };
+
+ Layout.prototype.charge = function() {
+ return this._charge();
+ };
+
+ return Layout;
+
+ })();
+
+ Alchemy.prototype.generateLayout = function(instance) {
+ var a;
+ a = instance;
+ return function(start) {
+ var conf;
+ if (start == null) {
+ start = false;
+ }
+ conf = a.conf;
+ a.layout = new Layout(a);
+ return a.force = d3.layout.force().size([conf.graphWidth(), conf.graphHeight()]).theta(1.0).gravity(a.layout.gravity()).friction(a.layout.friction()).nodes(a.elements.nodes.d3).links(a.elements.edges.d3).linkDistance(function(link) {
+ return a.layout.linkDistancefn(link);
+ }).linkStrength(function(link) {
+ return a.layout.linkStrength(link);
+ }).charge(a.layout.charge()).chargeDistance(a.layout.chargeDistance());
+ };
+ };
+
+ Alchemy.prototype.search = function(instance) {
+ var a;
+ a = instance;
+ return {
+ init: function() {
+ var searchBox;
+ searchBox = a.dash.select("#search input");
+ return searchBox.on("keyup", function() {
+ var input;
+ input = searchBox[0][0].value.toLowerCase();
+ a.vis.selectAll(".node").classed("inactive", false);
+ a.vis.selectAll("text").attr("style", function() {
+ if (input !== "") {
+ return "display: inline;";
+ }
+ });
+ return a.vis.selectAll(".node").classed("inactive", function(node) {
+ var DOMtext, hidden;
+ DOMtext = d3.select(this).text();
+ switch (a.conf.searchMethod) {
+ case 'contains':
+ hidden = DOMtext.toLowerCase().indexOf(input) < 0;
+ break;
+ case 'begins':
+ hidden = DOMtext.toLowerCase().indexOf(input) !== 0;
+ }
+ if (hidden) {
+ a.vis.selectAll("[source-target*='" + node.id + "']").classed("inactive", hidden);
+ } else {
+ a.vis.selectAll("[source-target*='" + node.id + "']").classed("inactive", function(edge) {
+ var nodeIDs, sourceHidden, targetHidden;
+ nodeIDs = [edge.source.id, edge.target.id];
+ sourceHidden = a.vis.select("#node-" + nodeIDs[0]).classed("inactive");
+ targetHidden = a.vis.select("#node-" + nodeIDs[1]).classed("inactive");
+ return targetHidden || sourceHidden;
+ });
+ }
+ return hidden;
+ });
+ });
+ }
+ };
+ };
+
+ Alchemy.prototype.startGraph = function(instance) {
+ var a;
+ a = instance;
+ return function(data) {
+ var conf, d3Edges, d3Nodes, defs, editor, editorInteractions;
+ conf = a.conf;
+ if (d3.select(conf.divSelector).empty()) {
+ console.warn(a.utils.warnings.divWarning());
+ }
+ if (!data) {
+ data = {
+ nodes: [],
+ edges: []
+ };
+ a.utils.warnings.dataWarning();
+ }
+ if (data.edges == null) {
+ data.edges = [];
+ }
+ a.create.nodes(data.nodes);
+ data.edges.forEach(function(e) {
+ return a.create.edges(e);
+ });
+ a.vis = d3.select(conf.divSelector).attr("style", "width:" + (conf.graphWidth()) + "px; height:" + (conf.graphHeight()) + "px; background:" + conf.backgroundColour + ";").append("svg").attr("xmlns", "http://www.w3.org/2000/svg").attr("xlink", "http://www.w3.org/1999/xlink").attr("pointer-events", "all").attr("style", "background:" + conf.backgroundColour + ";").attr("alchInst", Alchemy.prototype.instances.length - 1).on('click', a.interactions.deselectAll).call(a.interactions.zoom(conf.scaleExtent)).on("dblclick.zoom", null).append('g').attr("transform", "translate(" + conf.initialTranslate + ") scale(" + conf.initialScale + ")");
+ a.interactions.zoom().scale(conf.initialScale);
+ a.interactions.zoom().translate(conf.initialTranslate);
+ a.index = Alchemy.prototype.Index(a);
+ a.generateLayout();
+ a.controlDash.init();
+ d3Edges = a.elements.edges.d3;
+ d3Nodes = a.elements.nodes.d3;
+ a.layout.positionRootNodes();
+ a.force.start();
+ if (conf.forceLocked) {
+ while (a.force.alpha() > 0.005) {
+ a.force.tick();
+ }
+ }
+ a._drawEdges = a.drawing.DrawEdges;
+ a._drawNodes = a.drawing.DrawNodes;
+ a._drawEdges.createEdge(d3Edges);
+ a._drawNodes.createNode(d3Nodes);
+ a.index();
+ a.elements.nodes.svg.attr("transform", function(id, i) {
+ return "translate(" + id.x + ", " + id.y + ")";
+ });
+ console.log(Date() + ' completed initial computation');
+ if (!conf.forceLocked) {
+ a.force.on("tick", a.layout.tick).start();
+ }
+ if (conf.afterLoad != null) {
+ if (typeof conf.afterLoad === 'function') {
+ conf.afterLoad();
+ } else if (typeof conf.afterLoad === 'string') {
+ a[conf.afterLoad] = true;
+ }
+ }
+ if (conf.cluster) {
+ defs = d3.select("" + a.conf.divSelector + " svg").append("svg:defs");
+ }
+ if (conf.nodeStats) {
+ a.stats.nodeStats();
+ }
+ if (conf.showEditor) {
+ editor = new a.editor.Editor;
+ editorInteractions = new a.editor.Interactions;
+ d3.select("body").on('keydown', editorInteractions.deleteSelected);
+ editor.startEditor();
+ }
+ return a.initial = true;
+ };
+ };
+
+ Alchemy.prototype.stats = function(instance) {
+ var a;
+ a = instance;
+ return {
+ init: function() {
+ return a.stats.update();
+ },
+ nodeStats: function() {
+ var activeNodes, allNodes, caption, inactiveNodes, nodeData, nodeGraph, nodeKeys, nodeNum, nodeStats, nodeType, nodeTypes, _i, _len, _ref;
+ nodeData = [];
+ allNodes = a.get.allNodes().length;
+ activeNodes = a.get.activeNodes().length;
+ inactiveNodes = allNodes - activeNodes;
+ nodeStats = "<li class = 'list-group-item gen_node_stat'>Number of nodes: <span class='badge'>" + allNodes + "</span></li> <li class = 'list-group-item gen_node_stat'>Number of active nodes: <span class='badge'>" + activeNodes + "</span></li> <li class = 'list-group-item gen_node_stat'>Number of inactive nodes: <span class='badge'>" + inactiveNodes + "</span></li></br>";
+ if (a.conf.nodeTypes) {
+ nodeKeys = Object.keys(a.conf.nodeTypes);
+ nodeTypes = '';
+ _ref = a.conf.nodeTypes[nodeKeys];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ nodeType = _ref[_i];
+ caption = nodeType.replace('_', ' ');
+ nodeNum = a.vis.selectAll("g.node." + nodeType)[0].length;
+ nodeTypes += "<li class = 'list-group-item nodeType' id='li-" + nodeType + "' name = " + caption + ">Number of <strong style='text-transform: uppercase'>" + caption + "</strong> nodes: <span class='badge'>" + nodeNum + "</span></li>";
+ nodeData.push(["" + nodeType, nodeNum]);
+ }
+ nodeStats += nodeTypes;
+ }
+ nodeGraph = "<li id='node-stats-graph' class='list-group-item'></li>";
+ nodeStats += nodeGraph;
+ a.dash.select('#node-stats').html(nodeStats);
+ return this.insertSVG("node", nodeData);
+ },
+ edgeStats: function() {
+ var activeEdges, allEdges, caption, edgeData, edgeGraph, edgeKeys, edgeNum, edgeStats, edgeType, edgeTypes, inactiveEdges, _i, _len;
+ edgeData = [];
+ allEdges = a.get.allEdges().length;
+ activeEdges = a.get.activeEdges().length;
+ inactiveEdges = allEdges - activeEdges;
+ edgeStats = "<li class = 'list-group-item gen_edge_stat'>Number of relationships: <span class='badge'>" + allEdges + "</span></li> <li class = 'list-group-item gen_edge_stat'>Number of active relationships: <span class='badge'>" + activeEdges + "</span></li> <li class = 'list-group-item gen_edge_stat'>Number of inactive relationships: <span class='badge'>" + inactiveEdges + "</span></li></br>";
+ if (a.conf.edgeTypes) {
+ edgeKeys = _.values(alchemy.conf.edgeTypes)[0];
+ edgeTypes = '';
+ for (_i = 0, _len = edgeKeys.length; _i < _len; _i++) {
+ edgeType = edgeKeys[_i];
+ if (!edgeType) {
+ continue;
+ }
+ caption = edgeType.replace('_', ' ');
+ edgeNum = _.filter(a.get.allEdges(), function(edge) {
+ if (edge._edgeType === edgeType) {
+ return edge;
+ }
+ }).length;
+ edgeTypes += "<li class = 'list-group-item edgeType' id='li-" + edgeType + "' name = " + caption + ">Number of <strong style='text-transform: uppercase'>" + caption + "</strong> relationships: <span class='badge'>" + edgeNum + "</span></li>";
+ edgeData.push(["" + caption, edgeNum]);
+ }
+ edgeStats += edgeTypes;
+ }
+ edgeGraph = "<li id='node-stats-graph' class='list-group-item'></li>";
+ edgeStats += edgeGraph;
+ a.dash.select('#rel-stats').html(edgeStats);
+ return this.insertSVG("edge", edgeData);
+ },
+ insertSVG: function(element, data) {
+ var arc, arcs, color, height, pie, radius, svg, width;
+ if (data === null) {
+ return a.dash.select("#" + element + "-stats-graph").html("<br><h4 class='no-data'>There are no " + element + "Types listed in your conf.</h4>");
+ } else {
+ width = a.conf.graphWidth() * .25;
+ height = 250;
+ radius = width / 4;
+ color = d3.scale.category20();
+ arc = d3.svg.arc().outerRadius(radius - 10).innerRadius(radius / 2);
+ pie = d3.layout.pie().sort(null).value(function(d) {
+ return d[1];
+ });
+ svg = a.dash.select("#" + element + "-stats-graph").append("svg").append("g").style({
+ "width": width,
+ "height": height
+ }).attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
+ arcs = svg.selectAll(".arc").data(pie(data)).enter().append("g").classed("arc", true).on("mouseover", function(d, i) {
+ return a.dash.select("#" + data[i][0] + "-stat").classed("hidden", false);
+ }).on("mouseout", function(d, i) {
+ return a.dash.select("#" + data[i][0] + "-stat").classed("hidden", true);
+ });
+ arcs.append("path").attr("d", arc).attr("stroke", function(d, i) {
+ return color(i);
+ }).attr("stroke-width", 2).attr("fill-opacity", "0.3");
+ return arcs.append("text").attr("transform", function(d) {
+ return "translate(" + arc.centroid(d) + ")";
+ }).attr("id", function(d, i) {
+ return "" + data[i][0] + "-stat";
+ }).attr("dy", ".35em").classed("hidden", true).text(function(d, i) {
+ return data[i][0];
+ });
+ }
+ },
+ update: function() {
+ if (a.conf.nodeStats) {
+ this.nodeStats();
+ }
+ if (a.conf.edgeStats) {
+ return this.edgeStats();
+ }
+ }
+ };
+ };
+
+ Alchemy.prototype.updateGraph = function(instance) {
+ var a;
+ a = instance;
+ return function() {
+ a.generateLayout();
+ a._drawEdges.createEdge(a.elements.edges.d3);
+ a._drawNodes.createNode(a.elements.nodes.d3);
+ a.layout.positionRootNodes();
+ a.force.start();
+ while (a.force.alpha() > 0.005) {
+ a.force.tick();
+ }
+ a.force.on("tick", a.layout.tick).start();
+ return a.elements.nodes.svg.attr('transform', function(id, i) {
+ return "translate(" + id.x + ", " + id.y + ")";
+ });
+ };
+ };
+
+ Alchemy.prototype.defaults = {
+ plugins: null,
+ renderer: "svg",
+ graphWidth: function() {
+ return d3.select(this.divSelector).node().parentElement.clientWidth;
+ },
+ graphHeight: function() {
+ if (d3.select(this.divSelector).node().parentElement.nodeName === "BODY") {
+ return window.innerHeight;
+ } else {
+ return d3.select(this.divSelector).node().parentElement.clientHeight;
+ }
+ },
+ alpha: 0.5,
+ collisionDetection: true,
+ nodeOverlap: 25,
+ fixNodes: false,
+ fixRootNodes: false,
+ forceLocked: true,
+ linkDistancefn: 'default',
+ nodePositions: null,
+ showEditor: false,
+ captionToggle: false,
+ toggleRootNodes: false,
+ removeElement: false,
+ cluster: false,
+ clusterKey: "cluster",
+ clusterColours: d3.shuffle(["#DD79FF", "#FFFC00", "#00FF30", "#5168FF", "#00C0FF", "#FF004B", "#00CDCD", "#f83f00", "#f800df", "#ff8d8f", "#ffcd00", "#184fff", "#ff7e00"]),
+ clusterControl: false,
+ nodeStats: false,
+ edgeStats: false,
+ edgeFilters: false,
+ nodeFilters: false,
+ edgesToggle: false,
+ nodesToggle: false,
+ zoomControls: false,
+ nodeCaption: 'caption',
+ nodeCaptionsOnByDefault: false,
+ nodeStyle: {
+ "all": {
+ "radius": 10,
+ "color": "#68B9FE",
+ "borderColor": "#127DC1",
+ "borderWidth": function(d, radius) {
+ return radius / 3;
+ },
+ "captionColor": "#FFFFFF",
+ "captionBackground": null,
+ "captionSize": 12,
+ "selected": {
+ "color": "#FFFFFF",
+ "borderColor": "#349FE3"
+ },
+ "highlighted": {
+ "color": "#EEEEFF"
+ },
+ "hidden": {
+ "color": "none",
+ "borderColor": "none"
+ }
+ }
+ },
+ nodeColour: null,
+ nodeMouseOver: 'caption',
+ nodeRadius: 10,
+ nodeTypes: null,
+ rootNodes: 'root',
+ rootNodeRadius: 15,
+ nodeClick: null,
+ edgeCaption: 'caption',
+ edgeCaptionsOnByDefault: false,
+ edgeStyle: {
+ "all": {
+ "width": 4,
+ "color": "#CCC",
+ "opacity": 0.2,
+ "directed": true,
+ "curved": true,
+ "selected": {
+ "opacity": 1
+ },
+ "highlighted": {
+ "opacity": 1
+ },
+ "hidden": {
+ "opacity": 0
+ }
+ }
+ },
+ edgeTypes: null,
+ curvedEdges: false,
+ edgeWidth: function() {
+ return 4;
+ },
+ edgeOverlayWidth: 20,
+ directedEdges: false,
+ edgeArrowSize: 5,
+ edgeClick: null,
+ search: false,
+ searchMethod: "contains",
+ backgroundColour: "#000000",
+ theme: null,
+ afterLoad: 'afterLoad',
+ divSelector: '#alchemy',
+ dataSource: null,
+ initialScale: 1,
+ initialTranslate: [0, 0],
+ scaleExtent: [0.5, 2.4],
+ exportSVG: false,
+ dataWarning: "default",
+ warningMessage: "There be no data! What's going on?"
+ };
+
+ DrawEdge = function(instance) {
+ return {
+ a: instance,
+ createLink: function(edge) {
+ var conf;
+ conf = this.a.conf;
+ edge.append('path').attr('class', 'edge-line').attr('id', function(d) {
+ return "path-" + d.id;
+ });
+ edge.filter(function(d) {
+ return d.caption != null;
+ }).append('text');
+ return edge.append('path').attr('class', 'edge-handler').style('stroke-width', "" + conf.edgeOverlayWidth).style('opacity', "0");
+ },
+ styleLink: function(edge) {
+ var a, conf, utils;
+ a = this.a;
+ conf = this.a.conf;
+ utils = this.a.drawing.EdgeUtils;
+ return edge.each(function(d) {
+ var curve, curviness, edgeWalk, endx, endy, g, midpoint, startx, starty;
+ edgeWalk = utils.edgeWalk(d);
+ curviness = conf.curvedEdges ? 30 : 0;
+ curve = curviness / 10;
+ startx = d.source.radius + (d["stroke-width"] / 2);
+ starty = curviness / 10;
+ midpoint = edgeWalk.edgeLength / 2;
+ endx = edgeWalk.edgeLength - (d.target.radius - (d.target["stroke-width"] / 2));
+ endy = curviness / 10;
+ g = d3.select(this);
+ g.style(utils.edgeStyle(d));
+ g.attr('transform', "translate(" + d.source.x + ", " + d.source.y + ") rotate(" + edgeWalk.edgeAngle + ")");
+ g.select('.edge-line').attr('d', (function() {
+ var arrow, line, w;
+ line = "M" + startx + "," + starty + "q" + midpoint + "," + curviness + " " + endx + "," + endy;
+ if (conf.directedEdges) {
+ w = d["stroke-width"] * 2;
+ arrow = "l" + (-w) + "," + (w + curve) + " l" + w + "," + (-w - curve) + " l" + (-w) + "," + (-w + curve);
+ return line + arrow;
+ }
+ return line;
+ })());
+ return g.select('.edge-handler').attr('d', function(d) {
+ return g.select('.edge-line').attr('d');
+ });
+ });
+ },
+ classEdge: function(edge) {
+ return edge.classed('active', true);
+ },
+ styleText: function(edge) {
+ var conf, curved, utils;
+ conf = this.a.conf;
+ curved = conf.curvedEdges;
+ utils = this.a.drawing.EdgeUtils;
+ return edge.select('text').each(function(d) {
+ var dx, edgeWalk;
+ edgeWalk = utils.edgeWalk(d);
+ dx = edgeWalk.edgeLength / 2;
+ return d3.select(this).attr('dx', "" + dx).text(d.caption).attr("xlink:xlink:href", "#path-" + d.source.id + "-" + d.target.id).style("display", function(d) {
+ if (conf.edgeCaptionsOnByDefault) {
+ return "block";
+ }
+ });
+ });
+ },
+ setInteractions: function(edge) {
+ var interactions;
+ interactions = this.a.interactions;
+ return edge.select('.edge-handler').on('click', interactions.edgeClick).on('mouseover', function(d) {
+ return interactions.edgeMouseOver(d);
+ }).on('mouseout', function(d) {
+ return interactions.edgeMouseOut(d);
+ });
+ }
+ };
+ };
+
+ DrawEdges = function(instance) {
+ return {
+ a: instance,
+ createEdge: function(d3Edges) {
+ var drawEdge, edge;
+ drawEdge = this.a.drawing.DrawEdge;
+ edge = this.a.vis.selectAll("g.edge").data(d3Edges);
+ edge.enter().append('g').attr("id", function(d) {
+ return "edge-" + d.id + "-" + d.pos;
+ }).attr('class', function(d) {
+ return "edge " + d.edgeType;
+ }).attr('source-target', function(d) {
+ return "" + d.source.id + "-" + d.target.id;
+ });
+ drawEdge.createLink(edge);
+ drawEdge.classEdge(edge);
+ drawEdge.styleLink(edge);
+ drawEdge.styleText(edge);
+ drawEdge.setInteractions(edge);
+ edge.exit().remove();
+ if (this.a.conf.directedEdges && this.a.conf.curvedEdges) {
+ return edge.select('.edge-line').attr('marker-end', 'url(#arrow)');
+ }
+ },
+ updateEdge: function(d3Edge) {
+ var drawEdge, edge;
+ drawEdge = this.a.drawing.DrawEdge;
+ edge = this.a.vis.select("#edge-" + d3Edge.id + "-" + d3Edge.pos);
+ drawEdge.classEdge(edge);
+ drawEdge.styleLink(edge);
+ drawEdge.styleText(edge);
+ return drawEdge.setInteractions(edge);
+ }
+ };
+ };
+
+ DrawNode = function(instance) {
+ return {
+ a: instance,
+ styleText: function(node) {
+ var conf, nodes, utils;
+ conf = this.a.conf;
+ utils = this.a.drawing.NodeUtils;
+ nodes = this.a._nodes;
+ return node.selectAll("text").attr('dy', function(d) {
+ if (nodes[d.id].getProperties().root) {
+ return conf.rootNodeRadius / 2;
+ } else {
+ return conf.nodeRadius * 2 - 5;
+ }
+ }).attr('visibility', function(d) {
+ if (nodes[d.id]._state === "hidden") {
+ return "hidden";
+ } else {
+ return "visible";
+ }
+ }).text(function(d) {
+ return utils.nodeText(d);
+ }).style("display", function(d) {
+ if (conf.nodeCaptionsOnByDefault) {
+ return "block";
+ }
+ });
+ },
+ createNode: function(node) {
+ node = _.difference(node, node.select("circle").data());
+ node.__proto__ = d3.select().__proto__;
+ node.append('circle').attr('id', function(d) {
+ return "circle-" + d.id;
+ });
+ return node.append('svg:text').attr('id', function(d) {
+ return "text-" + d.id;
+ });
+ },
+ styleNode: function(node) {
+ var utils;
+ utils = this.a.drawing.NodeUtils;
+ return node.selectAll('circle').attr('r', function(d) {
+ if (typeof d.radius === "function") {
+ return d.radius();
+ } else {
+ return d.radius;
+ }
+ }).each(function(d) {
+ return d3.select(this).style(utils.nodeStyle(d));
+ });
+ },
+ setInteractions: function(node) {
+ var conf, coreInteractions, drag, editorEnabled, editorInteractions, nonRootNodes, rootNodes;
+ conf = this.a.conf;
+ coreInteractions = this.a.interactions;
+ editorEnabled = this.a.get.state("interactions") === "editor";
+ drag = d3.behavior.drag().origin(Object).on("dragstart", null).on("drag", null).on("dragend", null);
+ if (editorEnabled) {
+ editorInteractions = new this.a.editor.Interactions;
+ return node.on('mouseup', function(d) {
+ return editorInteractions.nodeMouseUp(d);
+ }).on('mouseover', function(d) {
+ return editorInteractions.nodeMouseOver(d);
+ }).on('mouseout', function(d) {
+ return editorInteractions.nodeMouseOut(d);
+ }).on('dblclick', function(d) {
+ return coreInteractions.nodeDoubleClick(d);
+ }).on('click', function(d) {
+ return editorInteractions.nodeClick(d);
+ });
+ } else {
+ node.on('mouseup', null).on('mouseover', function(d) {
+ return coreInteractions.nodeMouseOver(d);
+ }).on('mouseout', function(d) {
+ return coreInteractions.nodeMouseOut(d);
+ }).on('dblclick', function(d) {
+ return coreInteractions.nodeDoubleClick(d);
+ }).on('click', function(d) {
+ return coreInteractions.nodeClick(d);
+ });
+ drag = d3.behavior.drag().origin(Object).on("dragstart", coreInteractions.nodeDragStarted).on("drag", coreInteractions.nodeDragged).on("dragend", coreInteractions.nodeDragended);
+ if (!conf.fixNodes) {
+ nonRootNodes = node.filter(function(d) {
+ return d.root !== true;
+ });
+ nonRootNodes.call(drag);
+ }
+ if (!conf.fixRootNodes) {
+ rootNodes = node.filter(function(d) {
+ return d.root === true;
+ });
+ return rootNodes.call(drag);
+ }
+ }
+ }
+ };
+ };
+
+ DrawNodes = function(instance) {
+ return {
+ a: instance,
+ createNode: function(d3Nodes) {
+ var drawNode, node;
+ drawNode = this.a.drawing.DrawNode;
+ node = this.a.vis.selectAll("g.node").data(d3Nodes, function(n) {
+ return n.id;
+ });
+ node.enter().append("g").attr("class", function(d) {
+ var nodeType;
+ nodeType = d.self._nodeType;
+ return "node " + nodeType + " active";
+ }).attr('id', function(d) {
+ return "node-" + d.id;
+ }).classed('root', function(d) {
+ return d.root;
+ });
+ drawNode.createNode(node);
+ drawNode.styleNode(node);
+ drawNode.styleText(node);
+ drawNode.setInteractions(node);
+ return node.exit().remove();
+ },
+ updateNode: function(alchemyNode) {
+ var drawNode, node;
+ drawNode = this.a.drawing.DrawNode;
+ node = this.a.vis.select("#node-" + alchemyNode.id);
+ drawNode.styleNode(node);
+ drawNode.styleText(node);
+ return drawNode.setInteractions(node);
+ }
+ };
+ };
+
+ Alchemy.prototype.EdgeUtils = function(instance) {
+ return {
+ a: instance,
+ edgeStyle: function(d) {
+ var clustering, conf, edge, nodes, styles;
+ conf = this.a.conf;
+ edge = this.a._edges[d.id][d.pos];
+ styles = this.a.svgStyles.edge.update(edge);
+ nodes = this.a._nodes;
+ if (this.a.conf.cluster) {
+ clustering = this.a.layout._clustering;
+ styles.stroke = (function(d) {
+ var clusterKey, gid, id, index, source, target;
+ clusterKey = conf.clusterKey;
+ source = nodes[d.source.id]._properties;
+ target = nodes[d.target.id]._properties;
+ if (source.root || target.root) {
+ index = source.root ? target[clusterKey] : source[clusterKey];
+ return "" + (clustering.getClusterColour(index));
+ } else if (source[clusterKey] === target[clusterKey]) {
+ index = source[clusterKey];
+ return "" + (clustering.getClusterColour(index));
+ } else if (source[clusterKey] !== target[clusterKey]) {
+ id = "" + source[clusterKey] + "-" + target[clusterKey];
+ gid = "cluster-gradient-" + id;
+ return "url(#" + gid + ")";
+ }
+ })(d);
+ }
+ return styles;
+ },
+ triangle: function(edge) {
+ var height, hyp, width;
+ width = edge.target.x - edge.source.x;
+ height = edge.target.y - edge.source.y;
+ hyp = Math.sqrt(height * height + width * width);
+ return [width, height, hyp];
+ },
+ edgeWalk: function(edge) {
+ var curveOffset, edgeLength, edgeWidth, height, hyp, startPathX, width, _ref;
+ _ref = this.triangle(edge), width = _ref[0], height = _ref[1], hyp = _ref[2];
+ edgeWidth = edge['stroke-width'];
+ curveOffset = 2;
+ startPathX = edge.source.radius + edge.source['stroke-width'] - (edgeWidth / 2) + curveOffset;
+ edgeLength = hyp - startPathX - curveOffset * 1.5;
+ return {
+ edgeAngle: Math.atan2(height, width) / Math.PI * 180,
+ edgeLength: edgeLength
+ };
+ },
+ middleLine: function(edge) {
+ return this.curvedDirectedEdgeWalk(edge, 'middle');
+ },
+ startLine: function(edge) {
+ return this.curvedDirectedEdgeWalk(edge, 'linkStart');
+ },
+ endLine: function(edge) {
+ return this.curvedDirectedEdgeWalk(edge, 'linkEnd');
+ },
+ edgeLength: function(edge) {
+ var height, hyp, width;
+ width = edge.target.x - edge.source.x;
+ height = edge.target.y - edge.source.y;
+ return hyp = Math.sqrt(height * height + width * width);
+ },
+ edgeAngle: function(edge) {
+ var height, width;
+ width = edge.target.x - edge.source.x;
+ height = edge.target.y - edge.source.y;
+ return Math.atan2(height, width) / Math.PI * 180;
+ },
+ captionAngle: function(angle) {
+ if (angle < -90 || angle > 90) {
+ return 180;
+ } else {
+ return 0;
+ }
+ },
+ middlePath: function(edge) {
+ var midPoint, pathNode;
+ pathNode = this.a.vis.select("#path-" + edge.id).node();
+ midPoint = pathNode.getPointAtLength(pathNode.getTotalLength() / 2);
+ return {
+ x: midPoint.x,
+ y: midPoint.y
+ };
+ },
+ middlePathCurve: function(edge) {
+ var midPoint, pathNode;
+ pathNode = d3.select("#path-" + edge.id).node();
+ midPoint = pathNode.getPointAtLength(pathNode.getTotalLength() / 2);
+ return {
+ x: midPoint.x,
+ y: midPoint.y
+ };
+ }
+ };
+ };
+
+ Alchemy.prototype.NodeUtils = function(instance) {
+ var a;
+ a = instance;
+ return {
+ nodeStyle: function(d) {
+ var conf, node;
+ conf = a.conf;
+ node = d.self;
+ if (conf.cluster && (node._state !== "hidden")) {
+ d.fill = (function(d) {
+ var clusterMap, clustering, colour, colourIndex, colours, key, nodeProp;
+ clustering = a.layout._clustering;
+ nodeProp = node.getProperties();
+ clusterMap = clustering.clusterMap;
+ key = conf.clusterKey;
+ colours = conf.clusterColours;
+ colourIndex = clusterMap[nodeProp[key]] % colours.length;
+ colour = colours[colourIndex];
+ return "" + colour;
+ })(d);
+ d.stroke = d.fill;
+ }
+ return d;
+ },
+ nodeText: function(d) {
+ var caption, conf, nodeProps;
+ conf = a.conf;
+ nodeProps = a._nodes[d.id]._properties;
+ if (conf.nodeCaption && typeof conf.nodeCaption === 'string') {
+ if (nodeProps[conf.nodeCaption] != null) {
+ return nodeProps[conf.nodeCaption];
+ } else {
+ return '';
+ }
+ } else if (conf.nodeCaption && typeof conf.nodeCaption === 'function') {
+ caption = conf.nodeCaption(nodeProps);
+ if (caption === void 0 || String(caption) === 'undefined') {
+ a.log["caption"] = "At least one caption returned undefined";
+ conf.caption = false;
+ }
+ return caption;
+ }
+ }
+ };
+ };
+
+ Alchemy.prototype.svgStyles = function(instance) {
+ return {
+ a: instance,
+ node: {
+ a: this.a,
+ populate: function(node) {
+ var conf, d, defaultStyle, fill, nodeType, nodeTypeKey, radius, stroke, strokeWidth, style, svgStyles, toFunc, typedStyle;
+ conf = this.a.conf;
+ defaultStyle = _.omit(conf.nodeStyle.all, "selected", "highlighted", "hidden");
+ d = node;
+ toFunc = function(inp) {
+ if (typeof inp === "function") {
+ return inp;
+ }
+ return function() {
+ return inp;
+ };
+ };
+ nodeTypeKey = _.keys(conf.nodeTypes)[0];
+ nodeType = node.getProperties()[nodeTypeKey];
+ if (conf.nodeStyle[nodeType] === void 0) {
+ nodeType = "all";
+ }
+ typedStyle = _.assign(_.cloneDeep(defaultStyle), conf.nodeStyle[nodeType]);
+ style = _.assign(typedStyle, conf.nodeStyle[nodeType][node._state]);
+ radius = toFunc(style.radius);
+ fill = toFunc(style.color);
+ stroke = toFunc(style.borderColor);
+ strokeWidth = toFunc(style.borderWidth);
+ svgStyles = {};
+ svgStyles["radius"] = radius(d);
+ svgStyles["fill"] = fill(d);
+ svgStyles["stroke"] = stroke(d);
+ svgStyles["stroke-width"] = strokeWidth(d, radius(d));
+ return svgStyles;
+ }
+ },
+ edge: {
+ a: this.a,
+ populate: function(edge) {
+ var color, conf, defaultStyle, edgeType, opacity, style, svgStyles, toFunc, typedStyle, width;
+ conf = this.a.conf;
+ defaultStyle = _.omit(conf.edgeStyle.all, "selected", "highlighted", "hidden");
+ toFunc = function(inp) {
+ if (typeof inp === "function") {
+ return inp;
+ }
+ return function() {
+ return inp;
+ };
+ };
+ edgeType = edge._edgeType;
+ if (conf.edgeStyle[edgeType] === void 0) {
+ edgeType = "all";
+ }
+ typedStyle = _.assign(_.cloneDeep(defaultStyle), conf.edgeStyle[edgeType]);
+ style = _.assign(typedStyle, conf.edgeStyle[edgeType][edge._state]);
+ width = toFunc(style.width);
+ color = toFunc(style.color);
+ opacity = toFunc(style.opacity);
+ svgStyles = {
+ "stroke": color(edge),
+ "stroke-width": width(edge),
+ "opacity": opacity(edge),
+ "fill": "none"
+ };
+ return svgStyles;
+ },
+ update: function(edge) {
+ var color, conf, opacity, style, svgStyles, toFunc, width;
+ conf = this.a.conf;
+ style = edge._style;
+ toFunc = function(inp) {
+ if (typeof inp === "function") {
+ return inp;
+ }
+ return function() {
+ return inp;
+ };
+ };
+ width = toFunc(style.width);
+ color = toFunc(style.color);
+ opacity = toFunc(style.opacity);
+ svgStyles = {
+ "stroke": color(edge),
+ "stroke-width": width(edge),
+ "opacity": opacity(edge),
+ "fill": "none"
+ };
+ return svgStyles;
+ }
+ }
+ };
+ };
+
+ Editor = (function() {
+ function Editor() {
+ this.nodeEditor = __bind(this.nodeEditor, this);
+ this.startEditor = __bind(this.startEditor, this);
+ this.utils = new alchemy.editor.Utils;
+ }
+
+ Editor.prototype.editorContainerHTML = "<div id=\"editor-header\" data-toggle=\"collapse\" data-target=\"#editor #element-options\">\n <h3>Editor</h3><span class=\"fa fa-2x fa-caret-right\"></span>\n</div>\n<div id=\"element-options\" class=\"collapse\">\n <ul class=\"list-group\"> \n <li class=\"list-group-item\" id=\"remove\">Remove Selected</li> \n <li class=\"list-group-item\" id=\"editor-interactions\">Editor mode enabled, click to disable editor interactions</li>\n </ul>\n</div>";
+
+ Editor.prototype.elementEditorHTML = function(type) {
+ return "<h4>" + type + " Editor</h4>\n<form id=\"add-property-form\">\n <div id=\"add-property\">\n <input class=\"form-control\" id=\"add-prop-key\" placeholder=\"New Property Name\">\n <input class=\"form-control\" id=\"add-prop-value\" placeholder=\"New Property Value\">\n </div>\n <input id=\"add-prop-submit\" type=\"submit\" value=\"Add Property\" placeholder=\"add a property to this node\">\n</form>\n<form id=\"properties-list\">\n <input id=\"update-properties\" type=\"submit\" value=\"Update Properties\">\n</form>";
+ };
+
+ Editor.prototype.startEditor = function() {
+ var divSelector, editor, editor_interactions, html, utils;
+ divSelector = alchemy.conf.divSelector;
+ html = this.editorContainerHTML;
+ editor = alchemy.dash.select("#control-dash").append("div").attr("id", "editor").html(html);
+ editor.select('#editor-header').on('click', function() {
+ if (alchemy.dash.select('#element-options').classed("in")) {
+ return alchemy.dash.select("#editor-header>span").attr("class", "fa fa-2x fa-caret-right");
+ } else {
+ return alchemy.dash.select("#editor-header>span").attr("class", "fa fa-2x fa-caret-down");
+ }
+ });
+ editor_interactions = editor.select('#element-options ul #editor-interactions').on('click', function() {
+ return d3.select(this).attr("class", function() {
+ if (alchemy.get.state() === 'editor') {
+ alchemy.set.state('interactions', 'default');
+ return "inactive list-group-item";
+ } else {
+ alchemy.set.state('interactions', 'editor');
+ return "active list-group-item";
+ }
+ }).html(function() {
+ if (alchemy.get.state() === 'editor') {
+ return "Disable Editor Interactions";
+ } else {
+ return "Enable Editor Interactions";
+ }
+ });
+ });
+ editor.select("#element-options ul #remove").on("click", function() {
+ return alchemy.editor.remove();
+ });
+ utils = this.utils;
+ return editor_interactions.on("click", function() {
+ if (!alchemy.dash.select("#editor-interactions").classed("active")) {
+ utils.enableEditor();
+ return alchemy.dash.select("#editor-interactions").classed({
+ "active": true,
+ "inactive": false
+ }).html("Editor mode enabled, click to disable editor interactions");
+ } else {
+ utils.disableEditor();
+ return alchemy.dash.select("#editor-interactions").classed({
+ "active": false,
+ "inactive": true
+ }).html("Editor mode disabled, click to enable editor interactions");
+ }
+ });
+ };
+
+ Editor.prototype.nodeEditor = function(n) {
+ var add_property, divSelector, editor, elementEditor, html, nodeProperties, node_property, options, property, property_list, updateProperty, val;
+ divSelector = alchemy.conf.divSelector;
+ editor = alchemy.dash.select("#control-dash #editor");
+ options = editor.select('#element-options');
+ html = this.elementEditorHTML("Node");
+ elementEditor = options.append('div').attr('id', 'node-editor').html(html);
+ elementEditor.attr("class", function() {
+ var active;
+ active = alchemy.dash.select("#editor-interactions").classed("active");
+ if (active) {
+ return "enabled";
+ }
+ return "hidden";
+ });
+ add_property = editor.select("#node-editor form #add-property");
+ add_property.select("#node-add-prop-key").attr("placeholder", "New Property Name").attr("value", null);
+ add_property.select("#node-add-prop-value").attr("placeholder", "New Property Value").attr("value", null);
+ alchemy.dash.select("#add-property-form").on("submit", function() {
+ var key, value;
+ event.preventDefault();
+ key = alchemy.dash.select('#add-prop-key').property('value');
+ key = key.replace(/\s/g, "_");
+ value = alchemy.dash.select('#add-prop-value').property('value');
+ updateProperty(key, value, true);
+ alchemy.dash.selectAll("#add-property .edited-property").classed({
+ "edited-property": false
+ });
+ return this.reset();
+ });
+ nodeProperties = alchemy._nodes[n.id].getProperties();
+ alchemy.vis.select("#node-" + n.id).classed({
+ "editing": true
+ });
+ property_list = editor.select("#node-editor #properties-list");
+ for (property in nodeProperties) {
+ val = nodeProperties[property];
+ node_property = property_list.append("div").attr("id", "node-" + property).attr("class", "property form-inline form-group");
+ node_property.append("label").attr("for", "node-" + property + "-input").attr("class", "form-control property-name").text("" + property);
+ node_property.append("input").attr("id", "node-" + property + "-input").attr("class", "form-control property-value").attr("value", "" + val);
+ }
+ alchemy.dash.select("#properties-list").on("submit", function() {
+ var key, properties, selection, value, _i, _len, _ref;
+ event.preventDefault();
+ properties = alchemy.dash.selectAll(".edited-property");
+ _ref = properties[0];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ property = _ref[_i];
+ selection = alchemy.dash.select(property);
+ key = selection.select("label").text();
+ value = selection.select("input").attr('value');
+ updateProperty(key, value, false);
+ }
+ alchemy.dash.selectAll("#node-properties-list .edited-property").classed({
+ "edited-property": false
+ });
+ return this.reset();
+ });
+ d3.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown", function() {
+ if (d3.event.keyCode === 13) {
+ event.preventDefault();
+ }
+ return d3.select(this).classed({
+ "edited-property": true
+ });
+ });
+ return updateProperty = function(key, value, newProperty) {
+ var drawNodes, nodeID;
+ nodeID = n.id;
+ if ((key !== "") && (value !== "")) {
+ alchemy._nodes[nodeID].setProperty("" + key, "" + value);
+ drawNodes = alchemy._drawNodes;
+ drawNodes.updateNode(alchemy.viz.select("#node-" + nodeID));
+ if (newProperty === true) {
+ alchemy.dash.select("#node-add-prop-key").attr("value", "property added/updated to key: " + key);
+ return alchemy.dash.select("#node-add-prop-value").attr("value", "property at " + key + " updated to: " + value);
+ } else {
+ return alchemy.dash.select("#node-" + key + "-input").attr("value", "property at " + key + " updated to: " + value);
+ }
+ } else {
+ if (newProperty === true) {
+ alchemy.dash.select("#node-add-prop-key").attr("value", "null or invalid input");
+ return alchemy.dash.select("#node-add-prop-value").attr("value", "null or invlid input");
+ } else {
+ return alchemy.dash.select("#node-" + key + "-input").attr("value", "null or invalid input");
+ }
+ }
+ };
+ };
+
+ Editor.prototype.editorClear = function() {
+ alchemy.dash.selectAll(".node").classed({
+ "editing": false
+ });
+ alchemy.dash.selectAll(".edge").classed({
+ "editing": false
+ });
+ alchemy.dash.select("#node-editor").remove();
+ alchemy.dash.select("#edge-editor").remove();
+ return alchemy.dash.select("#node-add-prop-submit").attr("placeholder", function() {
+ if (alchemy.vis.selectAll(".selected").empty()) {
+ return "select a node or edge to edit properties";
+ }
+ return "add a property to this element";
+ });
+ };
+
+ Editor.prototype.edgeEditor = function(e) {
+ var add_property, divSelector, edgeProperties, edge_property, editor, elementEditor, html, options, property, property_list, updateProperty, val;
+ divSelector = alchemy.conf.divSelector;
+ editor = alchemy.dash("#control-dash #editor");
+ options = editor.select('#element-options');
+ html = this.elementEditorHTML("Edge");
+ elementEditor = options.append('div').attr('id', 'edge-editor').html(html);
+ elementEditor.attr("class", function() {
+ if (alchemy.dash.select("#editor-interactions").classed("active")) {
+ return "enabled";
+ }
+ return "hidden";
+ });
+ add_property = editor.select("#edge-editor form #add-property");
+ add_property.select("#add-prop-key").attr("placeholder", "New Property Name").attr("value", null);
+ add_property.select("#add-prop-value").attr("placeholder", "New Property Value").attr("value", null);
+ edgeProperties = alchemy._edges[e.id].getProperties();
+ alchemy.vis.select("#edge-" + e.id).classed({
+ "editing": true
+ });
+ property_list = editor.select("#edge-editor #properties-list");
+ for (property in edgeProperties) {
+ val = edgeProperties[property];
+ edge_property = property_list.append("div").attr("id", "edge-" + property).attr("class", "property form-inline form-group");
+ edge_property.append("label").attr("for", "edge-" + property + "-input").attr("class", "form-control property-name").text("" + property);
+ edge_property.append("input").attr("id", "edge-" + property + "-input").attr("class", "form-control property-value").attr("value", "" + val);
+ }
+ alchemy.dash.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown", function() {
+ if (d3.event.keyCode === 13) {
+ event.preventDefault();
+ }
+ return d3.select(this).classed({
+ "edited-property": true
+ });
+ });
+ alchemy.dash.select("#add-property-form").on("submit", function() {
+ var key, value;
+ event.preventDefault();
+ key = alchemy.dash.select("#add-prop-key").property('value');
+ key = key.replace(/\s/g, "_");
+ value = alchemy.dash.select("#add-prop-value").property('value');
+ updateProperty(key, value, true);
+ alchemy.dash.selectAll("#add-property .edited-property").classed({
+ "edited-property": false
+ });
+ return this.reset();
+ });
+ d3.select("#properties-list").on("submit", function() {
+ var key, properties, selection, value, _i, _len, _ref;
+ event.preventDefault();
+ properties =
<TRUNCATED>
[29/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/FontAwesome.otf
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/FontAwesome.otf b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/FontAwesome.otf
new file mode 100644
index 0000000..3461e3f
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/FontAwesome.otf differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.eot
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.eot b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..6cfd566
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.eot differ
[57/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/pom.xml b/example/application/neoapp/integtests/pom.xml
deleted file mode 100644
index da29c47..0000000
--- a/example/application/neoapp/integtests/pom.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
---><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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.isis.example.application</groupId>
- <artifactId>neoapp</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </parent>
-
- <artifactId>neoapp-integtests</artifactId>
- <name>Neo App Integration Tests</name>
-
- <build>
- <testResources>
- <testResource>
- <directory>src/test/resources</directory>
- </testResource>
- <testResource>
- <directory>src/test/java</directory>
- <includes>
- <include>**</include>
- </includes>
- <excludes>
- <exclude>**/*.java</exclude>
- </excludes>
- </testResource>
- </testResources>
- </build>
- <dependencies>
-
- <!-- other modules in this project -->
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>neoapp-fixture</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-unittestsupport</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-integtestsupport</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-specsupport</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.hamcrest</groupId>
- <artifactId>hamcrest-library</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-wrapper</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-runtime</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.hsqldb</groupId>
- <artifactId>hsqldb</artifactId>
- </dependency>
-
- <!--
- uncomment to enable enhanced cucumber-jvm reporting
- http://www.masterthought.net/section/cucumber-reporting
- <dependency>
- <groupId>com.googlecode.totallylazy</groupId>
- <artifactId>totallylazy</artifactId>
- <version>991</version>
- </dependency>
-
- <dependency>
- <groupId>net.masterthought</groupId>
- <artifactId>cucumber-reporting</artifactId>
- <version>0.0.21</version>
- </dependency>
- <dependency>
- <groupId>net.masterthought</groupId>
- <artifactId>maven-cucumber-reporting</artifactId>
- <version>0.0.4</version>
- </dependency>
- -->
- </dependencies>
-
- <!--
- uncomment for enhanced cucumber-jvm reporting
- http://www.masterthought.net/section/cucumber-reporting
- <repositories>
- <repository>
- <id>repo.bodar.com</id>
- <url>http://repo.bodar.com</url>
- </repository>
- </repositories>
- -->
-
-
-</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java b/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java
deleted file mode 100644
index fa67f2a..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package integration;
-
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.integtestsupport.IsisSystemForTest;
-import org.apache.isis.core.runtime.persistence.PersistenceConstants;
-import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPersistenceMechanismInstaller;
-import org.apache.isis.objectstore.jdo.datanucleus.IsisConfigurationForJdoIntegTests;
-
-/**
- * Holds an instance of an {@link IsisSystemForTest} as a {@link ThreadLocal} on the current thread,
- * initialized with ToDo app's domain services.
- */
-public class SimpleAppSystemInitializer {
-
- private SimpleAppSystemInitializer(){}
-
- public static IsisSystemForTest initIsft() {
- IsisSystemForTest isft = IsisSystemForTest.getElseNull();
- if(isft == null) {
- isft = new SimpleAppSystemBuilder().build().setUpSystem();
- IsisSystemForTest.set(isft);
- }
- return isft;
- }
-
- private static class SimpleAppSystemBuilder extends IsisSystemForTest.Builder {
-
- public SimpleAppSystemBuilder() {
- withLoggingAt(org.apache.log4j.Level.INFO);
- with(testConfiguration());
- with(new DataNucleusPersistenceMechanismInstaller());
-
- // services annotated with @DomainService
- withServicesIn( "dom.simple"
- ,"fixture.simple"
- ,"org.apache.isis.core.wrapper"
- ,"org.apache.isis.applib"
- ,"org.apache.isis.core.metamodel.services"
- ,"org.apache.isis.core.runtime.services"
- ,"org.apache.isis.objectstore.jdo.datanucleus.service.support" // IsisJdoSupportImpl
- ,"org.apache.isis.objectstore.jdo.datanucleus.service.eventbus" // EventBusServiceJdo
- );
- }
-
- private static IsisConfiguration testConfiguration() {
- final IsisConfigurationForJdoIntegTests testConfiguration = new IsisConfigurationForJdoIntegTests();
-
- // enable stricter checking
- testConfiguration.put(PersistenceConstants.ENFORCE_SAFE_SEMANTICS, "true");
-
- testConfiguration.addRegisterEntitiesPackagePrefix("dom");
- return testConfiguration;
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java b/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java
deleted file mode 100644
index 1950881..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
-O * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package integration.glue;
-
-import cucumber.api.java.After;
-import cucumber.api.java.Before;
-import integration.SimpleAppSystemInitializer;
-
-import org.apache.isis.core.specsupport.scenarios.ScenarioExecutionScope;
-import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
-
-public class BootstrappingGlue extends CukeGlueAbstract {
-
- // //////////////////////////////////////
-
- @Before(value={"@unit"}, order=100)
- public void beforeScenarioUnitScope() {
- before(ScenarioExecutionScope.UNIT);
- }
-
- @Before(value={"@integration"}, order=100)
- public void beforeScenarioIntegrationScope() {
- org.apache.log4j.PropertyConfigurator.configure("logging.properties");
- SimpleAppSystemInitializer.initIsft();
-
- before(ScenarioExecutionScope.INTEGRATION);
- }
-
- @After
- public void afterScenario(cucumber.api.Scenario sc) {
- assertMocksSatisfied();
- after(sc);
- }
-
- // //////////////////////////////////////
-
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java b/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
deleted file mode 100644
index 508a3a0..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package integration.glue;
-
-import cucumber.api.java.Before;
-import dom.simple.SimpleObject;
-import fixture.simple.scenario.SimpleObjectsFixture;
-
-import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
-import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
-
-public class CatalogOfFixturesGlue extends CukeGlueAbstract {
-
-
- @Before(value={"@unit", "@SimpleObjectsFixture"}, order=20000)
- public void unitFixtures() throws Throwable {
- final InMemoryDB inMemoryDB = new InMemoryDBForSimpleApp(this.scenarioExecution());
- inMemoryDB.getElseCreate(SimpleObject.class, "Foo");
- inMemoryDB.getElseCreate(SimpleObject.class, "Bar");
- inMemoryDB.getElseCreate(SimpleObject.class, "Baz");
- putVar("isis", "in-memory-db", inMemoryDB);
- }
-
- // //////////////////////////////////////
-
- @Before(value={"@integration", "@SimpleObjectsFixture"}, order=20000)
- public void integrationFixtures() throws Throwable {
- scenarioExecution().install(new SimpleObjectsFixture());
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java b/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java
deleted file mode 100644
index 50f0a51..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package integration.glue;
-
-import dom.simple.SimpleObject;
-
-import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
-import org.apache.isis.core.specsupport.scenarios.ScenarioExecution;
-
-public class InMemoryDBForSimpleApp extends InMemoryDB {
-
- public InMemoryDBForSimpleApp(ScenarioExecution scenarioExecution) {
- super(scenarioExecution);
- }
-
- /**
- * Hook to initialize if possible.
- */
- @Override
- protected void init(Object obj, String str) {
- if(obj instanceof SimpleObject) {
- SimpleObject toDoItem = (SimpleObject) obj;
- toDoItem.setName(str);
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java b/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java
deleted file mode 100644
index 13831ae..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package integration.glue.simple;
-
-import cucumber.api.java.en.Given;
-import cucumber.api.java.en.When;
-import dom.simple.SimpleObject;
-import dom.simple.SimpleObjects;
-
-import java.util.List;
-import java.util.UUID;
-import org.hamcrest.Description;
-import org.jmock.Expectations;
-import org.jmock.api.Action;
-import org.jmock.api.Invocation;
-import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
-import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class SimpleObjectGlue extends CukeGlueAbstract {
-
- @Given("^there are.* (\\d+) simple objects$")
- public void there_are_N_simple_objects(int n) throws Throwable {
- if(supportsMocks()) {
- checking(new Expectations() {
- {
- allowing(service(SimpleObjects.class)).listAll();
- will(returnValue(allSimpleObjects()));
- }
- });
- }
- try {
- final List<SimpleObject> findAll = service(SimpleObjects.class).listAll();
- assertThat(findAll.size(), is(n));
- putVar("list", "all", findAll);
-
- } finally {
- assertMocksSatisfied();
- }
- }
-
- @When("^I create a new simple object$")
- public void I_create_a_new_simple_object() throws Throwable {
- if(supportsMocks()) {
- checking(new Expectations() {
- {
- oneOf(service(SimpleObjects.class)).create(with(any(String.class)));
- will(addToInMemoryDB());
- }
- });
- }
- service(SimpleObjects.class).create(UUID.randomUUID().toString());
- }
-
- private Action addToInMemoryDB() {
- return new Action() {
-
- @Override
- public Object invoke(Invocation invocation) throws Throwable {
- final InMemoryDB inMemoryDB = getVar("isis", "in-memory-db", InMemoryDB.class);
- final String name = (String)invocation.getParameter(0);
- final SimpleObject obj = new SimpleObject();
- obj.setName(name);
- inMemoryDB.put(SimpleObject.class, name, obj);
- return obj;
- }
-
- @Override
- public void describeTo(Description description) {
- description.appendText("add to database");
- }
- };
- }
-
- // helper
- private List<SimpleObject> allSimpleObjects() {
- final InMemoryDB inMemoryDB = getVar("isis", "in-memory-db", InMemoryDB.class);
- return inMemoryDB.findAll(SimpleObject.class);
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java
deleted file mode 100644
index b4d0913..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package integration.specs.simple;
-
-import cucumber.api.junit.Cucumber;
-
-import org.junit.runner.RunWith;
-
-
-/**
- * Runs scenarios in all <tt>.feature</tt> files (this package and any subpackages).
- */
-@RunWith(Cucumber.class)
-@Cucumber.Options(
- format = {
- "html:target/cucumber-html-report"
- ,"json:target/cucumber.json"
- },
- glue={"classpath:integration.glue"},
- strict = true,
- tags = { "~@backlog", "~@ignore" })
-public class RunSpecs {
- // intentionally empty
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature
deleted file mode 100644
index aa7aeb6..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-@SimpleObjectsFixture
-Feature: List and Create New Simple Objectts
-
- # the scenario is listed twice here just to demonstrate that it
- # can be run either at @unit-level scope (using mocks) or
- # at @integration-level scope (against the running system).
-
- @unit
- Scenario: Existing simple objects can be listed and new ones created
- Given there are initially 3 simple objects
- When I create a new simple object
- Then there are 4 simple objects
-
-
- @integration
- Scenario: Existing simple objects can be listed and new ones created
- Given there are initially 3 simple objects
- When I create a new simple object
- Then there are 4 simple objects
-
-
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java b/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java
deleted file mode 100644
index 634476c..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package integration.tests;
-
-import integration.SimpleAppSystemInitializer;
-
-import org.junit.BeforeClass;
-import org.apache.isis.core.integtestsupport.IntegrationTestAbstract;
-import org.apache.isis.core.integtestsupport.scenarios.ScenarioExecutionForIntegration;
-
-public abstract class SimpleAppIntegTest extends IntegrationTestAbstract {
-
- @BeforeClass
- public static void initClass() {
- org.apache.log4j.PropertyConfigurator.configure("logging.properties");
- SimpleAppSystemInitializer.initIsft();
-
- // instantiating will install onto ThreadLocal
- new ScenarioExecutionForIntegration();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
deleted file mode 100644
index 13e24f9..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package integration.tests.smoke;
-
-import dom.simple.SimpleObject;
-import dom.simple.SimpleObjects;
-import fixture.simple.scenario.SimpleObjectsFixture;
-import fixture.simple.SimpleObjectsTearDownFixture;
-import integration.tests.SimpleAppIntegTest;
-
-import javax.inject.Inject;
-import org.junit.Test;
-import org.apache.isis.applib.fixturescripts.FixtureScript;
-import org.apache.isis.applib.fixturescripts.FixtureScripts;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-public class SimpleObjectTest extends SimpleAppIntegTest {
-
- @Inject
- FixtureScripts fixtureScripts;
- @Inject
- SimpleObjects simpleObjects;
-
- FixtureScript fixtureScript;
-
- public static class Name extends SimpleObjectTest {
-
- @Test
- public void exists() throws Exception {
-
- // given
- fixtureScript = new SimpleObjectsFixture();
- fixtureScripts.runFixtureScript(fixtureScript, null);
-
- final SimpleObject simpleObjectPojo =
- fixtureScript.lookup("simple-objects-fixture/simple-object-for-foo/item-1", SimpleObject.class);
-
- // when
- assertThat(simpleObjectPojo, is(not(nullValue())));
- final SimpleObject simpleObjectWrapped = wrap(simpleObjectPojo);
-
- // then
- assertThat(simpleObjectWrapped.getName(), is("Foo"));
- }
-
- @Test
- public void doesNotExist() throws Exception {
-
- // given
- fixtureScript = new SimpleObjectsTearDownFixture();
- fixtureScripts.runFixtureScript(fixtureScript, null);
-
- // when
- SimpleObject simpleObjectPojo = fixtureScript.lookup("non-existent", SimpleObject.class);
-
- // then
- assertThat(simpleObjectPojo, is(nullValue()));
-
- }
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
deleted file mode 100644
index 3963c8c..0000000
--- a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package integration.tests.smoke;
-
-import dom.simple.SimpleObject;
-import dom.simple.SimpleObjects;
-import fixture.simple.scenario.SimpleObjectsFixture;
-import fixture.simple.SimpleObjectsTearDownFixture;
-import integration.tests.SimpleAppIntegTest;
-
-import java.sql.SQLIntegrityConstraintViolationException;
-import java.util.List;
-import javax.inject.Inject;
-import com.google.common.base.Throwables;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.apache.isis.applib.fixturescripts.FixtureScript;
-import org.apache.isis.applib.fixturescripts.FixtureScripts;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class SimpleObjectsTest extends SimpleAppIntegTest {
-
- @Rule
- public ExpectedException expectedException = ExpectedException.none();
-
- @Inject
- FixtureScripts fixtureScripts;
- @Inject
- SimpleObjects simpleObjects;
-
- FixtureScript fixtureScript;
-
- public static class ListAll extends SimpleObjectsTest {
-
- @Test
- public void happyCase() throws Exception {
-
- // given
- fixtureScript = new SimpleObjectsFixture();
- fixtureScripts.runFixtureScript(fixtureScript, null);
- nextTransaction();
-
- // when
- final List<SimpleObject> all = wrap(simpleObjects).listAll();
-
- // then
- assertThat(all.size(), is(3));
-
- SimpleObject simpleObject = wrap(all.get(0));
- assertThat(simpleObject.getName(), is("Foo"));
- }
-
- @Test
- public void whenNone() throws Exception {
-
- // given
- fixtureScript = new SimpleObjectsTearDownFixture();
- fixtureScripts.runFixtureScript(fixtureScript, null);
- nextTransaction();
-
- // when
- final List<SimpleObject> all = wrap(simpleObjects).listAll();
-
- // then
- assertThat(all.size(), is(0));
- }
- }
-
- public static class Create extends SimpleObjectsTest {
-
- @Test
- public void happyCase() throws Exception {
-
- // given
- fixtureScript = new SimpleObjectsTearDownFixture();
- fixtureScripts.runFixtureScript(fixtureScript, null);
- nextTransaction();
-
- // when
- wrap(simpleObjects).create("Faz");
-
- // then
- final List<SimpleObject> all = wrap(simpleObjects).listAll();
- assertThat(all.size(), is(1));
- }
-
- @Test
- public void whenAlreadyExists() throws Exception {
-
- // given
- fixtureScript = new SimpleObjectsTearDownFixture();
- fixtureScripts.runFixtureScript(fixtureScript, null);
- nextTransaction();
- wrap(simpleObjects).create("Faz");
- nextTransaction();
-
- // then
- expectedException.expectCause(causalChainContains(SQLIntegrityConstraintViolationException.class));
-
- // when
- wrap(simpleObjects).create("Faz");
- nextTransaction();
- }
-
- private static Matcher<? extends Throwable> causalChainContains(final Class<?> cls) {
- return new TypeSafeMatcher<Throwable>() {
- @Override
- protected boolean matchesSafely(Throwable item) {
- final List<Throwable> causalChain = Throwables.getCausalChain(item);
- for (Throwable throwable : causalChain) {
- if(cls.isAssignableFrom(throwable.getClass())){
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void describeTo(Description description) {
- description.appendText("exception with causal chain containing " + cls.getSimpleName());
- }
- };
- }
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/pom.xml b/example/application/neoapp/pom.xml
deleted file mode 100644
index 8d9d86c..0000000
--- a/example/application/neoapp/pom.xml
+++ /dev/null
@@ -1,373 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
---><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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <groupId>org.apache.isis.example.application</groupId>
- <artifactId>neoapp</artifactId>
- <version>0.0.1-SNAPSHOT</version>
-
- <name>Neo App</name>
-
- <packaging>pom</packaging>
-
- <prerequisites>
- <maven>3.0.4</maven>
- </prerequisites>
-
- <properties>
- <isis.version>1.8.0-SNAPSHOT</isis.version>
- <isis-viewer-wicket.version>1.8.0-SNAPSHOT</isis-viewer-wicket.version>
-
- <!-- must be consistent with the versions defined by the JDO Objectstore -->
- <datanucleus-accessplatform-jdo-rdbms.version>4.0.4</datanucleus-accessplatform-jdo-rdbms.version>
- <datanucleus-jodatime.version>4.0.4</datanucleus-jodatime.version>
- <datanucleus-maven-plugin.version>4.0.0-release</datanucleus-maven-plugin.version>
-
-
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- </properties>
-
- <repositories>
- <repository>
- <id>apache.snapshots</id>
- <name>Apache Snapshots</name>
- <url>https://repository.apache.org/content/repositories/snapshots/</url>
- <releases>
- <enabled>false</enabled>
- </releases>
- <snapshots>
- </snapshots>
- </repository>
- <repository>
- <id>Cloudbees snapshots</id>
- <url>http://repository-estatio.forge.cloudbees.com/snapshot/</url>
- <snapshots>
- </snapshots>
- <releases>
- <enabled>false</enabled>
- </releases>
- </repository>
- </repositories>
-
- <build>
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- </configuration>
- <executions>
- <execution>
- <id>source</id>
- <phase>compile</phase>
- </execution>
- <execution>
- <id>test</id>
- <phase>test-compile</phase>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>2.16</version>
- <configuration>
- <includes>
- <include>**/*Test.java</include>
- <include>**/*Test$*.java</include>
- <include>**/*Test_*.java</include>
- <include>**/*Spec*.java</include>
- </includes>
- <excludes>
- <exclude>**/Test*.java</exclude>
- <exclude>**/*ForTesting.java</exclude>
- <exclude>**/*Abstract*.java</exclude>
- </excludes>
- <useFile>true</useFile>
- <printSummary>true</printSummary>
- <outputDirectory>${project.build.directory}/surefire-reports</outputDirectory>
- </configuration>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-report-plugin</artifactId>
- <version>2.16</version>
- <configuration>
- <includes>
- <include>**/*Test.java</include>
- <include>**/*Test$*.java</include>
- <include>**/*Test_*.java</include>
- <include>**/*Spec*.java</include>
- </includes>
- <excludes>
- <exclude>**/Test*.java</exclude>
- <exclude>**/*ForTesting.java</exclude>
- <exclude>**/*Abstract*.java</exclude>
- </excludes>
- <showSuccess>false</showSuccess>
- </configuration>
- <executions>
- <execution>
- <phase>test</phase>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <artifactId>maven-clean-plugin</artifactId>
- <version>2.5</version>
- </plugin>
- <plugin>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.6</version>
- </plugin>
- <plugin>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.4</version>
- </plugin>
- <plugin>
- <artifactId>maven-install-plugin</artifactId>
- <version>2.5.1</version>
- </plugin>
- <plugin>
- <artifactId>maven-deploy-plugin</artifactId>
- <version>2.8.1</version>
- </plugin>
- <plugin>
- <artifactId>maven-site-plugin</artifactId>
- <version>3.3</version>
- </plugin>
- <plugin>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.4</version>
- </plugin>
-
- <plugin>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>maven-jetty-plugin</artifactId>
- <version>6.1.26</version>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <version>2.2</version>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <version>1.7</version>
- <executions>
- <execution>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <!-- http://simplericity.com/2009/11/10/1257880778509.html -->
- <plugin>
- <groupId>org.simplericity.jettyconsole</groupId>
- <artifactId>jetty-console-maven-plugin</artifactId>
- <!-- update to 1.54 reversed,since seems compiled against 1.7 (major.minor version 51.0) -->
- <version>1.43</version>
- </plugin>
-
- <!-- Apache Release Audit Tool -->
- <plugin>
- <groupId>org.apache.rat</groupId>
- <artifactId>apache-rat-plugin</artifactId>
- <version>0.10</version>
- <configuration>
- <addDefaultLicenseMatchers>true</addDefaultLicenseMatchers>
- <excludeSubProjects>true</excludeSubProjects>
- <excludes>
- <exclude>**/target/**</exclude>
- <exclude>**/target-ide/**</exclude>
-
- <exclude>**/*.project</exclude>
- <exclude>**/.classpath</exclude>
- <exclude>**/.settings/**</exclude>
- <exclude>**/*.launch</exclude>
- <exclude>**/ide/eclipse/launch/**</exclude>
- <exclude>**/ide/intellij/launch/**</exclude>
- <exclude>src/site/resources/ide/eclipse/**</exclude>
-
- <exclude>**/rebel.xml</exclude>
- <exclude>**/*.gitignore</exclude>
- <exclude>**/*.log</exclude>
- <exclude>**/*.pdn</exclude>
- <exclude>**/*.svg</exclude>
- <exclude>**/*.json</exclude>
- <exclude>**/*.min.js</exclude>
- <exclude>**/*.js</exclude>
- </excludes>
- <licenses>
- <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
- <licenseFamilyCategory>AL2</licenseFamilyCategory>
- <licenseFamilyName>Apache License 2.0</licenseFamilyName>
- <notes/>
- <patterns>
- <pattern>Licensed to the Apache Software Foundation (ASF) under one</pattern>
- </patterns>
- </license>
- <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
- <licenseFamilyCategory>JQRY</licenseFamilyCategory>
- <licenseFamilyName>MIT</licenseFamilyName>
- <notes/>
- <patterns>
- <pattern>Dual licensed under the MIT or GPL Version 2 licenses.</pattern>
- </patterns>
- </license>
- <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
- <licenseFamilyCategory>JMOCK</licenseFamilyCategory>
- <licenseFamilyName>JMock</licenseFamilyName>
- <notes/>
- <patterns>
- <pattern>Copyright (c) 2000-2007, jMock.org</pattern>
- </patterns>
- </license>
- <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
- <licenseFamilyCategory>DOCBK</licenseFamilyCategory>
- <licenseFamilyName>DocBook 4.5</licenseFamilyName>
- <notes/>
- <patterns>
- <pattern>Permission to copy in any form is granted for use</pattern>
- <pattern>Permission to use, copy, modify and distribute the DocBook DTD</pattern>
- <pattern>is hereby granted in perpetuity, provided that the above copyright</pattern>
- <pattern>This is the catalog data file for DocBook XML V4.5. It is provided as</pattern>
- <pattern>XML Catalog data for DocBook XML V4.5</pattern>
- <pattern>DocBook additional general entities V4.5</pattern>
- <pattern>XML EXCHANGE TABLE MODEL DECLARATION MODULE</pattern>
- </patterns>
- </license>
- <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
- <licenseFamilyCategory>W3C</licenseFamilyCategory>
- <licenseFamilyName>XHTML</licenseFamilyName>
- <notes/>
- <patterns>
- <pattern>Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),</pattern>
- </patterns>
- </license>
- </licenses>
- <licenseFamilies>
- <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
- <familyName>Apache License 2.0</familyName>
- </licenseFamily>
- <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
- <familyName>MIT</familyName>
- </licenseFamily>
- <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
- <familyName>JMock</familyName>
- </licenseFamily>
- <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
- <familyName>DocBook 4.5</familyName>
- </licenseFamily>
- <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
- <familyName>XHTML</familyName>
- </licenseFamily>
- </licenseFamilies>
- </configuration>
- </plugin>
- </plugins>
- </pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-report-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- <dependencyManagement>
- <dependencies>
-
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis</artifactId>
- <version>${isis.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-wicket</artifactId>
- <version>${isis-viewer-wicket.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
-
-
- <!-- this project's own modules -->
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>neoapp-dom</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>neoapp-fixture</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>neoapp-webapp</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
-
-
- </dependencies>
- </dependencyManagement>
-
-
- <profiles>
- <profile>
- <id>m2e</id>
- <activation>
- <property>
- <name>m2e.version</name>
- </property>
- </activation>
- <build>
- <directory>target-ide</directory>
- </build>
- </profile>
- </profiles>
-
- <modules>
- <module>dom</module>
- <module>fixture</module>
- <module>integtests</module>
- <module>webapp</module>
- </modules>
-</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/.gitignore b/example/application/neoapp/webapp/.gitignore
deleted file mode 100644
index 0b7106e..0000000
--- a/example/application/neoapp/webapp/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/testDB/
-/.shell_history
-/messages.log
-/neo4j_DB/
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
deleted file mode 100644
index c7829fc..0000000
--- a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
- <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
- <listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
- </listAttribute>
- <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
- <listEntry value="1"/>
- </listAttribute>
- <mapAttribute key="org.eclipse.debug.core.preferred_launchers">
- <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[debug]"/>
- <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[run]"/>
- </mapAttribute>
- <stringAttribute value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector" key="org.eclipse.debug.core.source_locator_id"/>
- <stringAttribute value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <sourceLookupDirector> <sourceContainers duplicates="false"> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;javaProject name=&quot;isis-jrebel-plugin&quot;/&gt;&#13;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;default/&gt;&#13;&#10;" typeId="org.eclipse.debug.core.containerType.default"/> </sourceContainers> </sourceLookupDirector> " key="org.eclipse.debug.core.source_locator_meme
nto"/>
- <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
- <listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
- </listAttribute>
- <booleanAttribute value="true" key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS"/>
- <listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
- <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" path="1" type="4"/> "/>
- <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="simple_wicket_restful_jdo-webapp" type="1"/> "/>
- <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER" path="3" type="4"/> "/>
- </listAttribute>
- <stringAttribute value="org.eclipse.m2e.launchconfig.classpathProvider" key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER"/>
- <booleanAttribute value="true" key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH"/>
- <stringAttribute value="org.apache.isis.WebServer" key="org.eclipse.jdt.launching.MAIN_TYPE"/>
- <stringAttribute value="--port 8080 --type PROTOTYPE" key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS"/>
- <stringAttribute value="neoapp-webapp" key="org.eclipse.jdt.launching.PROJECT_ATTR"/>
- <stringAttribute value="org.eclipse.m2e.launchconfig.sourcepathProvider" key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER"/>
- <stringAttribute value="${jrebel_args} -Drebel.log=false -Drebel.check_class_hash=true -Drebel.packages_exclude=org.apache.isis -Dproject.root=${project_loc}/.. -Dtarget.dir=target-ide -Drebel.plugins=C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar -Disis-jrebel-plugin.packagePrefix=dom.simple,org.apache.isis.objectstore.jdo.applib -Disis-jrebel-plugin.loggingLevel=warn -XX:MaxPermSize=128m" key="org.eclipse.jdt.launching.VM_ARGUMENTS"/>
-</launchConfiguration>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch
deleted file mode 100644
index 7b321c1..0000000
--- a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
- <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
- <listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
- </listAttribute>
- <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
- <listEntry value="1"/>
- </listAttribute>
- <mapAttribute key="org.eclipse.debug.core.preferred_launchers">
- <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[debug]"/>
- <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[run]"/>
- </mapAttribute>
- <stringAttribute value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector" key="org.eclipse.debug.core.source_locator_id"/>
- <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
- <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
- </listAttribute>
- <booleanAttribute value="true" key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS"/>
- <stringAttribute value="org.eclipse.m2e.launchconfig.classpathProvider" key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER"/>
- <stringAttribute value="org.apache.isis.WebServer" key="org.eclipse.jdt.launching.MAIN_TYPE"/>
- <stringAttribute value="--port 8080 --type SERVER_PROTOTYPE" key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS"/>
- <stringAttribute value="neoapp-webapp" key="org.eclipse.jdt.launching.PROJECT_ATTR"/>
- <stringAttribute value="org.eclipse.m2e.launchconfig.sourcepathProvider" key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER"/>
-</launchConfiguration>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch
deleted file mode 100644
index c778a57..0000000
--- a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
- <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
- <listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
- </listAttribute>
- <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
- <listEntry value="1"/>
- </listAttribute>
- <mapAttribute key="org.eclipse.debug.core.preferred_launchers">
- <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[debug]"/>
- <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[run]"/>
- </mapAttribute>
- <stringAttribute value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector" key="org.eclipse.debug.core.source_locator_id"/>
- <booleanAttribute value="true" key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS"/>
- <stringAttribute value="org.eclipse.m2e.launchconfig.classpathProvider" key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER"/>
- <stringAttribute value="org.apache.isis.WebServer" key="org.eclipse.jdt.launching.MAIN_TYPE"/>
- <stringAttribute value="--port 8080 -D isis.persistor.datanucleus.install-fixtures=true --type SERVER_PROTOTYPE" key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS"/>
- <stringAttribute value="neoapp-webapp" key="org.eclipse.jdt.launching.PROJECT_ATTR"/>
- <stringAttribute value="org.eclipse.m2e.launchconfig.sourcepathProvider" key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER"/>
-</launchConfiguration>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch
deleted file mode 100644
index 422a178..0000000
--- a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch
+++ /dev/null
@@ -1,47 +0,0 @@
-<<<<<<< HEAD
-<?xml version="1.0" encoding="UTF-8"?><launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
- <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
- <listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
- </listAttribute>
- <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
- <listEntry value="1"/>
- </listAttribute>
- <mapAttribute key="org.eclipse.debug.core.preferred_launchers">
- <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[debug]"/>
- <mapEntry value="org.eclipse.jdt.launching.localJavaApplication" key="[run]"/>
- </mapAttribute>
- <stringAttribute value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector" key="org.eclipse.debug.core.source_locator_id"/>
- <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
- <listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
- </listAttribute>
- <booleanAttribute value="true" key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS"/>
- <stringAttribute value="org.eclipse.m2e.launchconfig.classpathProvider" key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER"/>
- <stringAttribute value="org.apache.isis.WebServer" key="org.eclipse.jdt.launching.MAIN_TYPE"/>
- <stringAttribute value="--port 8080 --type SERVER" key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS"/>
- <stringAttribute value="neoapp-webapp" key="org.eclipse.jdt.launching.PROJECT_ATTR"/>
- <stringAttribute value="org.eclipse.m2e.launchconfig.sourcepathProvider" key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER"/>
-=======
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
-<mapEntry key="[debug]" value="org.eclipse.jdt.launching.localJavaApplication"/>
-<mapEntry key="[run]" value="org.eclipse.jdt.launching.localJavaApplication"/>
-</mapAttribute>
-<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
-<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.apache.isis.WebServer"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--port 8080 --type SERVER"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="simpleapp-webapp"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
->>>>>>> refs/heads/DN_404
-</launchConfiguration>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/ide/intellij/launch/README.txt
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/intellij/launch/README.txt b/example/application/neoapp/webapp/ide/intellij/launch/README.txt
deleted file mode 100644
index 5f8e5ab..0000000
--- a/example/application/neoapp/webapp/ide/intellij/launch/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Copy into workspace\.idea\runConfigurations directory, and adjust file paths for Maven tasks.
-
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml
deleted file mode 100644
index 9833a2d..0000000
--- a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="SimpleApp-PROTOTYPE" type="Application" factoryName="Application" singleton="true">
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
- <option name="MAIN_CLASS_NAME" value="org.apache.isis.WebServer" />
- <option name="VM_PARAMETERS" value="" />
- <option name="PROGRAM_PARAMETERS" value="--type SERVER_PROTOTYPE --port 8080" />
- <option name="WORKING_DIRECTORY" value="file://$MODULE_DIR$" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" value="" />
- <option name="ENABLE_SWING_INSPECTOR" value="false" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <module name="neoapp-webapp" />
- <envs />
- <RunnerSettings RunnerId="Debug">
- <option name="DEBUG_PORT" value="" />
- <option name="TRANSPORT" value="0" />
- <option name="LOCAL" value="true" />
- </RunnerSettings>
- <RunnerSettings RunnerId="Run" />
- <ConfigurationWrapper RunnerId="Debug" />
- <ConfigurationWrapper RunnerId="Run" />
- <method>
- <option name="Make" enabled="false" />
- <option name="Maven.BeforeRunTask" enabled="true" file="C:/Apache/Isis/example/application/neoapp/dom/pom.xml" goal="datanucleus:enhance -o" />
- </method>
- </configuration>
-</component>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml
deleted file mode 100644
index a593956..0000000
--- a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-s <configuration default="false" name="SimpleApp (enhance only)" type="Application" factoryName="Application">
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
- <option name="MAIN_CLASS_NAME" value="org.apache.isis.Dummy" />
- <option name="VM_PARAMETERS" value="" />
- <option name="PROGRAM_PARAMETERS" value="" />
- <option name="WORKING_DIRECTORY" value="file://$MODULE_DIR$" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" value="" />
- <option name="ENABLE_SWING_INSPECTOR" value="false" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <module name="neoapp-webapp" />
- <envs />
- <RunnerSettings RunnerId="Run" />
- <ConfigurationWrapper RunnerId="Run" />
- <method>
- <option name="Make" enabled="false" />
- <option name="Maven.BeforeRunTask" enabled="true" file="C:/Apache/Isis/example/application/neoapp/dom/pom.xml" goal="datanucleus:enhance -o" />
- </method>
- </configuration>
-</component>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/lib/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/lib/.gitignore b/example/application/neoapp/webapp/lib/.gitignore
deleted file mode 100644
index 70eee7e..0000000
--- a/example/application/neoapp/webapp/lib/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# explicitly ignoring Microsoft JDBC4 jar
-# (cannot redistribute, licensing)
-#
-sqljdbc4.jar
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/pom.xml b/example/application/neoapp/webapp/pom.xml
deleted file mode 100644
index 1dd01ee..0000000
--- a/example/application/neoapp/webapp/pom.xml
+++ /dev/null
@@ -1,350 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
---><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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.isis.example.application</groupId>
- <artifactId>neoapp</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </parent>
-
- <artifactId>neoapp-webapp</artifactId>
- <name>Neo App Webapp</name>
-
- <description>This module runs both the Wicket viewer and the Restfulobjects viewer in a single webapp configured to run using the datanucleus object store.</description>
-
- <packaging>war</packaging>
-
- <properties>
- <siteBaseDir>..</siteBaseDir>
- </properties>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>maven-jetty-plugin</artifactId>
- </plugin>
-
- <!-- mvn package -->
- <plugin>
- <groupId>org.simplericity.jettyconsole</groupId>
- <artifactId>jetty-console-maven-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>createconsole</goal>
- </goals>
- <configuration>
- <backgroundImage>${basedir}/src/main/jettyconsole/isis-banner.png</backgroundImage>
- <destinationFile>${project.build.directory}/${project.build.finalName}-jetty-console.jar</destinationFile>
- </configuration>
- <phase>package</phase>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>1.8</version>
- <executions>
- <execution>
- <phase>validate</phase>
- <goals>
- <goal>maven-version</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <artifactId>maven-war-plugin</artifactId>
- <configuration>
- <warName>simpleapp</warName>
- <archive>
- <manifest>
- <addClasspath>false</addClasspath>
- </manifest>
- <manifestEntries>
- <Build-Time>${maven.build.timestamp}</Build-Time>
- <Build-Host>${agent.name}</Build-Host>
- <Build-User>${user.name}</Build-User>
- <Build-Maven>Maven ${maven.version}</Build-Maven>
- <Build-Java>${java.version}</Build-Java>
- <Build-OS>${os.name}</Build-OS>
- <Build-Label>${project.version}</Build-Label>
- </manifestEntries>
- </archive>
- </configuration>
- </plugin>
-
- </plugins>
- <pluginManagement>
- <plugins>
- <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
- <plugin>
- <groupId>org.eclipse.m2e</groupId>
- <artifactId>lifecycle-mapping</artifactId>
- <version>1.0.0</version>
- <configuration>
- <lifecycleMappingMetadata>
- <pluginExecutions>
- <pluginExecution>
- <pluginExecutionFilter>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <versionRange>[1.5,)</versionRange>
- <goals>
- <goal>maven-version</goal>
- </goals>
- </pluginExecutionFilter>
- <action>
- <ignore></ignore>
- </action>
- </pluginExecution>
- </pluginExecutions>
- </lifecycleMappingMetadata>
- </configuration>
- </plugin>
- </plugins>
- </pluginManagement>
- </build>
-
- <dependencies>
-
- <!-- other modules in this project -->
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>neoapp-dom</artifactId>
- <exclusions>
- <exclusion>
- <!-- so don't pick up transitive dependency to asm 4.0.0 -->
- <groupId>org.datanucleus</groupId>
- <artifactId>datanucleus-enhancer</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>neoapp-fixture</artifactId>
- <exclusions>
- <exclusion>
- <!-- so don't pick up transitive dependency to asm 4.0.0 -->
- <groupId>org.datanucleus</groupId>
- <artifactId>datanucleus-enhancer</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
- <!-- other isis components -->
- <dependency>
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-wicket-impl</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-viewer-restfulobjects-server</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-security-shiro</artifactId>
- </dependency>
-
-
- <!-- isis core -->
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-runtime</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-wrapper</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-security</artifactId>
- </dependency>
-
-
- <!-- to run using WebServer (optional) -->
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-webserver</artifactId>
- <scope>runtime</scope>
- <optional>true</optional>
- </dependency>
-
-
- <dependency>
- <groupId>org.apache.geronimo.specs</groupId>
- <artifactId>geronimo-servlet_2.5_spec</artifactId>
- <!--
- removed so can run o.a.i.WebServer from within IntelliJ;
- can rely on servlet container to ignore this in war file
- <scope>provided</scope>
- -->
- </dependency>
-
- <!--
- JDBC drivers
- (for jdo objectstore)
- -->
- <dependency>
- <groupId>org.datanucleus</groupId>
- <artifactId>datanucleus-neo4j</artifactId>
- <version>3.2.3</version>
- </dependency>
-
- <dependency>
- <groupId>org.hsqldb</groupId>
- <artifactId>hsqldb</artifactId>
- </dependency>
-
- <!--
- <dependency>
- <groupId>postgresql</groupId>
- <artifactId>postgresql</artifactId>
- <version>9.1-901.jdbc4</version>
- </dependency>
- -->
-
- <!--
- mvn install:install-file -Dfile=sqljdbc4.jar \
- -DgroupId=com.microsoft.sqlserver \
- -DartifactId=jdbc \
- -Dversion=4.0 \
- -Dpackaging=jar
- -->
- <!--
- <dependency>
- <groupId>com.microsoft.sqlserver</groupId>
- <artifactId>sqljdbc4</artifactId>
- <version>4.0</version>
- </dependency>
- -->
-
- <dependency>
- <groupId>org.lazyluke</groupId>
- <artifactId>log4jdbc-remix</artifactId>
- <exclusions>
- <exclusion>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
-
- <!-- https://github.com/Sprint/isis-neo4j -->
- <dependency>
- <groupId>com.sprint</groupId>
- <artifactId>isis-neo4j</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
-
- </dependencies>
-
- <profiles>
- <profile>
- <id>self-host</id>
- <build>
- <plugins>
- <!--
- mvn -P self-host antrun:run
- -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <configuration>
- <tasks>
- <exec executable="java" failonerror="true">
- <arg value="-jar" />
- <arg value="${project.build.directory}/${project.build.finalName}-jetty-console.jar" />
- </exec>
- </tasks>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </profile>
-
- <profile>
- <id>jrebel</id>
- <properties>
- <!-- as used in the rebel.xml in the dom project -->
- <target.dir>target</target.dir>
- <isis-jrebel-plugin.packagePrefix>dom.simple,org.apache.isis.objectstore.jdo.applib</isis-jrebel-plugin.packagePrefix>
- <isis-jrebel-plugin.loggingLevel>warn</isis-jrebel-plugin.loggingLevel>
- </properties>
- <build>
- <plugins>
- <!--
- mvn -P jrebel antrun:run \
- -Djrebel.jar="C:/Users/Dan/.IdeaIC13/config/plugins/jr-ide-idea/lib/jrebel/jrebel.jar" \
- -Disis_jrebel_plugin.jar="C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar"
- -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <configuration>
- <target>
- <property name="compile_classpath" refid="maven.compile.classpath" />
- <property name="runtime_classpath" refid="maven.runtime.classpath" />
- <property name="test_classpath" refid="maven.test.classpath" />
- <property name="plugin_classpath" refid="maven.plugin.classpath" />
-
- <echo message="" />
- <echo message="" />
- <echo message="jrebel.jar = ${jrebel.jar}" />
- <echo message="isis_jrebel_plugin.jar = ${isis_jrebel_plugin.jar}" />
- <echo message="target.dir = ${target.dir}" />
- <echo message="" />
- <echo message="" />
-
- <exec executable="java" failonerror="true">
- <arg value="-javaagent:${jrebel.jar}" />
- <arg value="-Drebel.log=false" />
- <arg value="-Drebel.check_class_hash=true" />
- <arg value="-Drebel.packages_exclude=org.apache.isis" />
-
- <!-- as used in the rebel.xml in the dom project -->
- <arg value="-Dproject.root=${project.basedir}/.." />
- <arg value="-Dtarget.dir=${target.dir}" />
-
- <arg value="-Drebel.plugins=${isis_jrebel_plugin.jar}" />
- <arg value="-Disis-jrebel-plugin.packagePrefix=${isis-jrebel-plugin.packagePrefix}" />
- <arg value="-Disis-jrebel-plugin.loggingLevel=${isis-jrebel-plugin.loggingLevel}" />
- <arg value="-XX:MaxPermSize=128m" />
- <arg value="-classpath" />
- <arg value="${runtime_classpath}" />
- <arg value="org.apache.isis.WebServer" />
- </exec>
- </target>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
-
-
-
-</project>
[22/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
ISIS-720: mothballing scimpi
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/2c7cfbfe
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/2c7cfbfe
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/2c7cfbfe
Branch: refs/heads/ISIS-789
Commit: 2c7cfbfecb1d58f4a05ecd6814064baa1ebb20b4
Parents: afc5cad
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sat Mar 28 13:06:13 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Mar 30 13:43:58 2015 +0100
----------------------------------------------------------------------
component/viewer/scimpi/NOTICE | 7 -
component/viewer/scimpi/dispatcher/pom.xml | 92 --
.../dispatcher/AbstractElementProcessor.java | 55 --
.../dispatcher/AbstractObjectProcessor.java | 53 --
.../isis/viewer/scimpi/dispatcher/Action.java | 37 -
.../viewer/scimpi/dispatcher/BlockContent.java | 23 -
.../scimpi/dispatcher/DispatchException.java | 40 -
.../viewer/scimpi/dispatcher/Dispatcher.java | 484 -----------
.../dispatcher/ElementContentProcessor.java | 24 -
.../scimpi/dispatcher/ElementProcessor.java | 30 -
.../viewer/scimpi/dispatcher/ErrorCollator.java | 148 ----
.../scimpi/dispatcher/ForbiddenException.java | 68 --
.../isis/viewer/scimpi/dispatcher/Names.java | 91 --
.../scimpi/dispatcher/NotLoggedInException.java | 31 -
.../scimpi/dispatcher/ResolveFieldUtil.java | 71 --
.../scimpi/dispatcher/ScimpiException.java | 44 -
.../dispatcher/ScimpiNotFoundException.java | 41 -
.../scimpi/dispatcher/TagOrderException.java | 31 -
.../viewer/scimpi/dispatcher/UserManager.java | 91 --
.../isis/viewer/scimpi/dispatcher/Util.java | 105 ---
.../scimpi/dispatcher/action/ActionAction.java | 268 ------
.../scimpi/dispatcher/action/Attributes.java | 131 ---
.../dispatcher/action/PropertyException.java | 44 -
.../action/RequiredPropertyException.java | 43 -
.../context/DefaultOidObjectMapping.java | 511 -----------
.../context/DefaultVersionMapping.java | 40 -
.../context/IndirectObjectMapping.java | 204 -----
.../scimpi/dispatcher/context/Mapping.java | 205 -----
.../dispatcher/context/ObjectMapping.java | 42 -
.../dispatcher/context/RequestContext.java | 857 -------------------
.../dispatcher/context/VersionMapping.java | 30 -
.../scimpi/dispatcher/debug/DebugAction.java | 257 ------
.../dispatcher/debug/DebugHtmlWriter.java | 45 -
.../dispatcher/debug/DebugUserAction.java | 71 --
.../scimpi/dispatcher/debug/DebugUsers.java | 98 ---
.../scimpi/dispatcher/debug/DebugUsersView.java | 50 --
.../scimpi/dispatcher/debug/ErrorDetails.java | 35 -
.../scimpi/dispatcher/debug/ErrorMessage.java | 35 -
.../scimpi/dispatcher/debug/ErrorReference.java | 35 -
.../scimpi/dispatcher/debug/LogAction.java | 75 --
.../scimpi/dispatcher/edit/EditAction.java | 266 ------
.../scimpi/dispatcher/edit/FieldEditState.java | 57 --
.../scimpi/dispatcher/edit/FormState.java | 67 --
.../scimpi/dispatcher/edit/RemoveAction.java | 114 ---
.../scimpi/dispatcher/logon/DomainSession.java | 42 -
.../scimpi/dispatcher/logon/LogonAction.java | 175 ----
.../scimpi/dispatcher/logon/LogoutAction.java | 70 --
.../scimpi/dispatcher/processor/Encoder.java | 26 -
.../dispatcher/processor/HtmlFileParser.java | 205 -----
.../scimpi/dispatcher/processor/PageWriter.java | 28 -
.../dispatcher/processor/ProcessorLookup.java | 256 ------
.../scimpi/dispatcher/processor/Request.java | 324 -------
.../dispatcher/processor/SimpleEncoder.java | 32 -
.../processor/TagProcessingException.java | 59 --
.../scimpi/dispatcher/util/MethodsUtils.java | 154 ----
.../viewer/scimpi/dispatcher/view/HelpLink.java | 72 --
.../viewer/scimpi/dispatcher/view/History.java | 150 ----
.../scimpi/dispatcher/view/HtmlSnippet.java | 51 --
.../viewer/scimpi/dispatcher/view/Snippet.java | 27 -
.../viewer/scimpi/dispatcher/view/SwfTag.java | 90 --
.../scimpi/dispatcher/view/VersionNumber.java | 70 --
.../dispatcher/view/action/ActionButton.java | 237 -----
.../dispatcher/view/action/ActionContent.java | 77 --
.../dispatcher/view/action/ActionForm.java | 262 ------
.../dispatcher/view/action/ActionLink.java | 179 ----
.../view/action/CreateFormParameter.java | 43 -
.../scimpi/dispatcher/view/action/Methods.java | 192 -----
.../dispatcher/view/action/Parameter.java | 47 -
.../dispatcher/view/action/RunAction.java | 87 --
.../scimpi/dispatcher/view/action/Services.java | 67 --
.../dispatcher/view/collection/Collection.java | 93 --
.../scimpi/dispatcher/view/debug/Debug.java | 479 -----------
.../dispatcher/view/debug/DebugAccessCheck.java | 40 -
.../view/debug/DebugCollectionView.java | 110 ---
.../dispatcher/view/debug/DebugObjectView.java | 136 ---
.../dispatcher/view/debug/DebuggerLink.java | 53 --
.../dispatcher/view/debug/Diagnostics.java | 81 --
.../scimpi/dispatcher/view/debug/Log.java | 46 -
.../scimpi/dispatcher/view/debug/LogLevel.java | 55 --
.../scimpi/dispatcher/view/debug/Members.java | 109 ---
.../scimpi/dispatcher/view/debug/ShowDebug.java | 41 -
.../dispatcher/view/debug/Specification.java | 119 ---
.../dispatcher/view/debug/ThrowException.java | 43 -
.../view/display/AbstractFormView.java | 142 ---
.../view/display/AbstractTableView.java | 149 ----
.../dispatcher/view/display/AddMessage.java | 44 -
.../dispatcher/view/display/AddWarning.java | 44 -
.../scimpi/dispatcher/view/display/Errors.java | 65 --
.../dispatcher/view/display/Feedback.java | 46 -
.../dispatcher/view/display/FieldLabel.java | 77 --
.../dispatcher/view/display/FieldValue.java | 118 ---
.../dispatcher/view/display/GetField.java | 103 ---
.../dispatcher/view/display/IncludeObject.java | 107 ---
.../dispatcher/view/display/ListView.java | 94 --
.../dispatcher/view/display/LongFormView.java | 84 --
.../dispatcher/view/display/Messages.java | 59 --
.../dispatcher/view/display/SelectedObject.java | 55 --
.../dispatcher/view/display/ShortFormView.java | 36 -
.../dispatcher/view/display/TableBlock.java | 86 --
.../dispatcher/view/display/TableBuilder.java | 92 --
.../dispatcher/view/display/TableCell.java | 94 --
.../view/display/TableContentWriter.java | 39 -
.../dispatcher/view/display/TableEmpty.java | 53 --
.../dispatcher/view/display/TableHeader.java | 39 -
.../dispatcher/view/display/TableRow.java | 49 --
.../dispatcher/view/display/TableView.java | 329 -------
.../scimpi/dispatcher/view/display/Title.java | 68 --
.../dispatcher/view/display/Warnings.java | 58 --
.../scimpi/dispatcher/view/edit/EditObject.java | 319 -------
.../dispatcher/view/edit/FieldFactory.java | 105 ---
.../scimpi/dispatcher/view/edit/FormEntry.java | 44 -
.../scimpi/dispatcher/view/edit/FormField.java | 44 -
.../dispatcher/view/edit/FormFieldBlock.java | 68 --
.../dispatcher/view/edit/HiddenField.java | 48 --
.../dispatcher/view/edit/RadioListField.java | 70 --
.../scimpi/dispatcher/view/edit/Selector.java | 158 ----
.../dispatcher/view/field/ExcludeField.java | 39 -
.../dispatcher/view/field/IncludeField.java | 39 -
.../dispatcher/view/field/InclusionList.java | 89 --
.../scimpi/dispatcher/view/field/LinkField.java | 45 -
.../view/field/LinkedFieldsBlock.java | 47 -
.../dispatcher/view/field/LinkedObject.java | 58 --
.../dispatcher/view/form/HiddenInputField.java | 41 -
.../dispatcher/view/form/HtmlFormBuilder.java | 214 -----
.../scimpi/dispatcher/view/form/InputField.java | 224 -----
.../scimpi/dispatcher/view/logon/Logoff.java | 38 -
.../scimpi/dispatcher/view/logon/Logon.java | 126 ---
.../dispatcher/view/logon/RestrictAccess.java | 41 -
.../scimpi/dispatcher/view/logon/Secure.java | 45 -
.../scimpi/dispatcher/view/logon/User.java | 77 --
.../view/simple/AbstractConditionalBlock.java | 565 ------------
.../dispatcher/view/simple/AbstractLink.java | 121 ---
.../dispatcher/view/simple/BlockDefine.java | 42 -
.../scimpi/dispatcher/view/simple/BlockUse.java | 46 -
.../scimpi/dispatcher/view/simple/Commit.java | 45 -
.../dispatcher/view/simple/ContentTag.java | 36 -
.../dispatcher/view/simple/CookieValue.java | 46 -
.../dispatcher/view/simple/DefaultValue.java | 52 --
.../scimpi/dispatcher/view/simple/EditLink.java | 71 --
.../dispatcher/view/simple/EndSession.java | 36 -
.../scimpi/dispatcher/view/simple/Forward.java | 37 -
.../dispatcher/view/simple/GetCookie.java | 39 -
.../scimpi/dispatcher/view/simple/Import.java | 37 -
.../view/simple/InitializeFromCookie.java | 80 --
.../view/simple/InitializeFromResult.java | 77 --
.../dispatcher/view/simple/Localization.java | 64 --
.../scimpi/dispatcher/view/simple/Mark.java | 43 -
.../dispatcher/view/simple/NewActionLink.java | 62 --
.../dispatcher/view/simple/ObjectLink.java | 68 --
.../dispatcher/view/simple/PageTitle.java | 35 -
.../scimpi/dispatcher/view/simple/Redirect.java | 37 -
.../dispatcher/view/simple/RemoveElement.java | 140 ---
.../scimpi/dispatcher/view/simple/ScopeTag.java | 51 --
.../dispatcher/view/simple/SetCookie.java | 53 --
.../view/simple/SetCookieFromField.java | 55 --
.../view/simple/SetFieldFromCookie.java | 52 --
.../dispatcher/view/simple/SetLocalization.java | 61 --
.../dispatcher/view/simple/SimpleButton.java | 39 -
.../dispatcher/view/simple/StartSession.java | 36 -
.../dispatcher/view/simple/TemplateTag.java | 40 -
.../scimpi/dispatcher/view/simple/Unless.java | 41 -
.../scimpi/dispatcher/view/simple/Variable.java | 64 --
.../scimpi/dispatcher/view/simple/When.java | 41 -
.../dispatcher/view/value/ActionName.java | 47 -
.../dispatcher/view/value/CountElements.java | 54 --
.../dispatcher/view/value/ElementType.java | 61 --
.../scimpi/dispatcher/view/value/FieldName.java | 65 --
.../dispatcher/view/value/ParameterName.java | 62 --
.../dispatcher/view/value/TitleString.java | 68 --
.../scimpi/dispatcher/view/value/Type.java | 57 --
component/viewer/scimpi/pom.xml | 131 ---
component/viewer/scimpi/servlet/pom.xml | 77 --
.../scimpi/servlet/DispatchException.java | 42 -
.../scimpi/servlet/DispatcherServlet.java | 89 --
.../isis/viewer/scimpi/servlet/ImageLookup.java | 174 ----
.../scimpi/servlet/ServletRequestContext.java | 373 --------
.../appended-resources/supplemental-models.xml | 106 ---
component/viewer/scimpi/tck/pom.xml | 98 ---
.../tck/src/main/resources/images/Default.png | Bin 3016 -> 0 bytes
.../main/webapp/ToDoItem/edit-selector.shtml | 29 -
.../src/main/webapp/ToDoItem/object-link.shtml | 32 -
.../src/main/webapp/ToDoItem/object-orig.shtml | 31 -
.../tck/src/main/webapp/ToDoItem/object.shtml | 34 -
.../tck/src/main/webapp/ToDoItem/object2.shtml | 31 -
.../tck/src/main/webapp/WEB-INF/isis.properties | 54 --
.../src/main/webapp/WEB-INF/logging.properties | 30 -
.../src/main/webapp/WEB-INF/security_file.allow | 16 -
.../main/webapp/WEB-INF/security_file.passwords | 20 -
.../scimpi/tck/src/main/webapp/WEB-INF/web.xml | 55 --
.../scimpi/tck/src/main/webapp/debug.shtml | 23 -
.../tck/src/main/webapp/generic/action.shtml | 27 -
.../src/main/webapp/generic/collection.shtml | 26 -
.../tck/src/main/webapp/generic/edit.shtml | 26 -
.../tck/src/main/webapp/generic/object.shtml | 28 -
.../scimpi/tck/src/main/webapp/images/Claim.png | Bin 2708 -> 0 bytes
.../tck/src/main/webapp/images/ClaimItem.png | Bin 2316 -> 0 bytes
.../tck/src/main/webapp/images/Employee.png | Bin 1986 -> 0 bytes
.../tck/src/main/webapp/images/banner-bg.png | Bin 384 -> 0 bytes
.../tck/src/main/webapp/images/banner.png | Bin 18951 -> 0 bytes
.../scimpi/tck/src/main/webapp/images/logo.png | Bin 7183 -> 0 bytes
.../scimpi/tck/src/main/webapp/index.shtml | 25 -
.../scimpi/tck/src/main/webapp/login.shtml | 23 -
.../scimpi/tck/src/main/webapp/style/screen.css | 394 ---------
.../tck/src/main/webapp/style/template.shtml | 47 -
mothballed/component/viewer/scimpi/NOTICE | 7 +
.../component/viewer/scimpi/dispatcher/pom.xml | 92 ++
.../dispatcher/AbstractElementProcessor.java | 55 ++
.../dispatcher/AbstractObjectProcessor.java | 53 ++
.../isis/viewer/scimpi/dispatcher/Action.java | 37 +
.../viewer/scimpi/dispatcher/BlockContent.java | 23 +
.../scimpi/dispatcher/DispatchException.java | 40 +
.../viewer/scimpi/dispatcher/Dispatcher.java | 484 +++++++++++
.../dispatcher/ElementContentProcessor.java | 24 +
.../scimpi/dispatcher/ElementProcessor.java | 30 +
.../viewer/scimpi/dispatcher/ErrorCollator.java | 148 ++++
.../scimpi/dispatcher/ForbiddenException.java | 68 ++
.../isis/viewer/scimpi/dispatcher/Names.java | 91 ++
.../scimpi/dispatcher/NotLoggedInException.java | 31 +
.../scimpi/dispatcher/ResolveFieldUtil.java | 71 ++
.../scimpi/dispatcher/ScimpiException.java | 44 +
.../dispatcher/ScimpiNotFoundException.java | 41 +
.../scimpi/dispatcher/TagOrderException.java | 31 +
.../viewer/scimpi/dispatcher/UserManager.java | 91 ++
.../isis/viewer/scimpi/dispatcher/Util.java | 105 +++
.../scimpi/dispatcher/action/ActionAction.java | 268 ++++++
.../scimpi/dispatcher/action/Attributes.java | 131 +++
.../dispatcher/action/PropertyException.java | 44 +
.../action/RequiredPropertyException.java | 43 +
.../context/DefaultOidObjectMapping.java | 511 +++++++++++
.../context/DefaultVersionMapping.java | 40 +
.../context/IndirectObjectMapping.java | 204 +++++
.../scimpi/dispatcher/context/Mapping.java | 205 +++++
.../dispatcher/context/ObjectMapping.java | 42 +
.../dispatcher/context/RequestContext.java | 857 +++++++++++++++++++
.../dispatcher/context/VersionMapping.java | 30 +
.../scimpi/dispatcher/debug/DebugAction.java | 257 ++++++
.../dispatcher/debug/DebugHtmlWriter.java | 45 +
.../dispatcher/debug/DebugUserAction.java | 71 ++
.../scimpi/dispatcher/debug/DebugUsers.java | 98 +++
.../scimpi/dispatcher/debug/DebugUsersView.java | 50 ++
.../scimpi/dispatcher/debug/ErrorDetails.java | 35 +
.../scimpi/dispatcher/debug/ErrorMessage.java | 35 +
.../scimpi/dispatcher/debug/ErrorReference.java | 35 +
.../scimpi/dispatcher/debug/LogAction.java | 75 ++
.../scimpi/dispatcher/edit/EditAction.java | 266 ++++++
.../scimpi/dispatcher/edit/FieldEditState.java | 57 ++
.../scimpi/dispatcher/edit/FormState.java | 67 ++
.../scimpi/dispatcher/edit/RemoveAction.java | 114 +++
.../scimpi/dispatcher/logon/DomainSession.java | 42 +
.../scimpi/dispatcher/logon/LogonAction.java | 175 ++++
.../scimpi/dispatcher/logon/LogoutAction.java | 70 ++
.../scimpi/dispatcher/processor/Encoder.java | 26 +
.../dispatcher/processor/HtmlFileParser.java | 205 +++++
.../scimpi/dispatcher/processor/PageWriter.java | 28 +
.../dispatcher/processor/ProcessorLookup.java | 256 ++++++
.../scimpi/dispatcher/processor/Request.java | 324 +++++++
.../dispatcher/processor/SimpleEncoder.java | 32 +
.../processor/TagProcessingException.java | 59 ++
.../scimpi/dispatcher/util/MethodsUtils.java | 154 ++++
.../viewer/scimpi/dispatcher/view/HelpLink.java | 72 ++
.../viewer/scimpi/dispatcher/view/History.java | 150 ++++
.../scimpi/dispatcher/view/HtmlSnippet.java | 51 ++
.../viewer/scimpi/dispatcher/view/Snippet.java | 27 +
.../viewer/scimpi/dispatcher/view/SwfTag.java | 90 ++
.../scimpi/dispatcher/view/VersionNumber.java | 70 ++
.../dispatcher/view/action/ActionButton.java | 237 +++++
.../dispatcher/view/action/ActionContent.java | 77 ++
.../dispatcher/view/action/ActionForm.java | 262 ++++++
.../dispatcher/view/action/ActionLink.java | 179 ++++
.../view/action/CreateFormParameter.java | 43 +
.../scimpi/dispatcher/view/action/Methods.java | 192 +++++
.../dispatcher/view/action/Parameter.java | 47 +
.../dispatcher/view/action/RunAction.java | 87 ++
.../scimpi/dispatcher/view/action/Services.java | 67 ++
.../dispatcher/view/collection/Collection.java | 93 ++
.../scimpi/dispatcher/view/debug/Debug.java | 479 +++++++++++
.../dispatcher/view/debug/DebugAccessCheck.java | 40 +
.../view/debug/DebugCollectionView.java | 110 +++
.../dispatcher/view/debug/DebugObjectView.java | 136 +++
.../dispatcher/view/debug/DebuggerLink.java | 53 ++
.../dispatcher/view/debug/Diagnostics.java | 81 ++
.../scimpi/dispatcher/view/debug/Log.java | 46 +
.../scimpi/dispatcher/view/debug/LogLevel.java | 55 ++
.../scimpi/dispatcher/view/debug/Members.java | 109 +++
.../scimpi/dispatcher/view/debug/ShowDebug.java | 41 +
.../dispatcher/view/debug/Specification.java | 119 +++
.../dispatcher/view/debug/ThrowException.java | 43 +
.../view/display/AbstractFormView.java | 142 +++
.../view/display/AbstractTableView.java | 149 ++++
.../dispatcher/view/display/AddMessage.java | 44 +
.../dispatcher/view/display/AddWarning.java | 44 +
.../scimpi/dispatcher/view/display/Errors.java | 65 ++
.../dispatcher/view/display/Feedback.java | 46 +
.../dispatcher/view/display/FieldLabel.java | 77 ++
.../dispatcher/view/display/FieldValue.java | 118 +++
.../dispatcher/view/display/GetField.java | 103 +++
.../dispatcher/view/display/IncludeObject.java | 107 +++
.../dispatcher/view/display/ListView.java | 94 ++
.../dispatcher/view/display/LongFormView.java | 84 ++
.../dispatcher/view/display/Messages.java | 59 ++
.../dispatcher/view/display/SelectedObject.java | 55 ++
.../dispatcher/view/display/ShortFormView.java | 36 +
.../dispatcher/view/display/TableBlock.java | 86 ++
.../dispatcher/view/display/TableBuilder.java | 92 ++
.../dispatcher/view/display/TableCell.java | 94 ++
.../view/display/TableContentWriter.java | 39 +
.../dispatcher/view/display/TableEmpty.java | 53 ++
.../dispatcher/view/display/TableHeader.java | 39 +
.../dispatcher/view/display/TableRow.java | 49 ++
.../dispatcher/view/display/TableView.java | 329 +++++++
.../scimpi/dispatcher/view/display/Title.java | 68 ++
.../dispatcher/view/display/Warnings.java | 58 ++
.../scimpi/dispatcher/view/edit/EditObject.java | 319 +++++++
.../dispatcher/view/edit/FieldFactory.java | 105 +++
.../scimpi/dispatcher/view/edit/FormEntry.java | 44 +
.../scimpi/dispatcher/view/edit/FormField.java | 44 +
.../dispatcher/view/edit/FormFieldBlock.java | 68 ++
.../dispatcher/view/edit/HiddenField.java | 48 ++
.../dispatcher/view/edit/RadioListField.java | 70 ++
.../scimpi/dispatcher/view/edit/Selector.java | 158 ++++
.../dispatcher/view/field/ExcludeField.java | 39 +
.../dispatcher/view/field/IncludeField.java | 39 +
.../dispatcher/view/field/InclusionList.java | 89 ++
.../scimpi/dispatcher/view/field/LinkField.java | 45 +
.../view/field/LinkedFieldsBlock.java | 47 +
.../dispatcher/view/field/LinkedObject.java | 58 ++
.../dispatcher/view/form/HiddenInputField.java | 41 +
.../dispatcher/view/form/HtmlFormBuilder.java | 214 +++++
.../scimpi/dispatcher/view/form/InputField.java | 224 +++++
.../scimpi/dispatcher/view/logon/Logoff.java | 38 +
.../scimpi/dispatcher/view/logon/Logon.java | 126 +++
.../dispatcher/view/logon/RestrictAccess.java | 41 +
.../scimpi/dispatcher/view/logon/Secure.java | 45 +
.../scimpi/dispatcher/view/logon/User.java | 77 ++
.../view/simple/AbstractConditionalBlock.java | 565 ++++++++++++
.../dispatcher/view/simple/AbstractLink.java | 121 +++
.../dispatcher/view/simple/BlockDefine.java | 42 +
.../scimpi/dispatcher/view/simple/BlockUse.java | 46 +
.../scimpi/dispatcher/view/simple/Commit.java | 45 +
.../dispatcher/view/simple/ContentTag.java | 36 +
.../dispatcher/view/simple/CookieValue.java | 46 +
.../dispatcher/view/simple/DefaultValue.java | 52 ++
.../scimpi/dispatcher/view/simple/EditLink.java | 71 ++
.../dispatcher/view/simple/EndSession.java | 36 +
.../scimpi/dispatcher/view/simple/Forward.java | 37 +
.../dispatcher/view/simple/GetCookie.java | 39 +
.../scimpi/dispatcher/view/simple/Import.java | 37 +
.../view/simple/InitializeFromCookie.java | 80 ++
.../view/simple/InitializeFromResult.java | 77 ++
.../dispatcher/view/simple/Localization.java | 64 ++
.../scimpi/dispatcher/view/simple/Mark.java | 43 +
.../dispatcher/view/simple/NewActionLink.java | 62 ++
.../dispatcher/view/simple/ObjectLink.java | 68 ++
.../dispatcher/view/simple/PageTitle.java | 35 +
.../scimpi/dispatcher/view/simple/Redirect.java | 37 +
.../dispatcher/view/simple/RemoveElement.java | 140 +++
.../scimpi/dispatcher/view/simple/ScopeTag.java | 51 ++
.../dispatcher/view/simple/SetCookie.java | 53 ++
.../view/simple/SetCookieFromField.java | 55 ++
.../view/simple/SetFieldFromCookie.java | 52 ++
.../dispatcher/view/simple/SetLocalization.java | 61 ++
.../dispatcher/view/simple/SimpleButton.java | 39 +
.../dispatcher/view/simple/StartSession.java | 36 +
.../dispatcher/view/simple/TemplateTag.java | 40 +
.../scimpi/dispatcher/view/simple/Unless.java | 41 +
.../scimpi/dispatcher/view/simple/Variable.java | 64 ++
.../scimpi/dispatcher/view/simple/When.java | 41 +
.../dispatcher/view/value/ActionName.java | 47 +
.../dispatcher/view/value/CountElements.java | 54 ++
.../dispatcher/view/value/ElementType.java | 61 ++
.../scimpi/dispatcher/view/value/FieldName.java | 65 ++
.../dispatcher/view/value/ParameterName.java | 62 ++
.../dispatcher/view/value/TitleString.java | 68 ++
.../scimpi/dispatcher/view/value/Type.java | 57 ++
mothballed/component/viewer/scimpi/pom.xml | 131 +++
.../component/viewer/scimpi/servlet/pom.xml | 77 ++
.../scimpi/servlet/DispatchException.java | 42 +
.../scimpi/servlet/DispatcherServlet.java | 89 ++
.../isis/viewer/scimpi/servlet/ImageLookup.java | 174 ++++
.../scimpi/servlet/ServletRequestContext.java | 373 ++++++++
.../appended-resources/supplemental-models.xml | 106 +++
mothballed/component/viewer/scimpi/tck/pom.xml | 98 +++
.../tck/src/main/resources/images/Default.png | Bin 0 -> 3016 bytes
.../main/webapp/ToDoItem/edit-selector.shtml | 29 +
.../src/main/webapp/ToDoItem/object-link.shtml | 32 +
.../src/main/webapp/ToDoItem/object-orig.shtml | 31 +
.../tck/src/main/webapp/ToDoItem/object.shtml | 34 +
.../tck/src/main/webapp/ToDoItem/object2.shtml | 31 +
.../tck/src/main/webapp/WEB-INF/isis.properties | 54 ++
.../src/main/webapp/WEB-INF/logging.properties | 30 +
.../src/main/webapp/WEB-INF/security_file.allow | 16 +
.../main/webapp/WEB-INF/security_file.passwords | 20 +
.../scimpi/tck/src/main/webapp/WEB-INF/web.xml | 55 ++
.../scimpi/tck/src/main/webapp/debug.shtml | 23 +
.../tck/src/main/webapp/generic/action.shtml | 27 +
.../src/main/webapp/generic/collection.shtml | 26 +
.../tck/src/main/webapp/generic/edit.shtml | 26 +
.../tck/src/main/webapp/generic/object.shtml | 28 +
.../scimpi/tck/src/main/webapp/images/Claim.png | Bin 0 -> 2708 bytes
.../tck/src/main/webapp/images/ClaimItem.png | Bin 0 -> 2316 bytes
.../tck/src/main/webapp/images/Employee.png | Bin 0 -> 1986 bytes
.../tck/src/main/webapp/images/banner-bg.png | Bin 0 -> 384 bytes
.../tck/src/main/webapp/images/banner.png | Bin 0 -> 18951 bytes
.../scimpi/tck/src/main/webapp/images/logo.png | Bin 0 -> 7183 bytes
.../scimpi/tck/src/main/webapp/index.shtml | 25 +
.../scimpi/tck/src/main/webapp/login.shtml | 23 +
.../scimpi/tck/src/main/webapp/style/screen.css | 394 +++++++++
.../tck/src/main/webapp/style/template.shtml | 47 +
pom.xml | 2 -
409 files changed, 18449 insertions(+), 18451 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/NOTICE
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/NOTICE b/component/viewer/scimpi/NOTICE
deleted file mode 100644
index ba21d0c..0000000
--- a/component/viewer/scimpi/NOTICE
+++ /dev/null
@@ -1,7 +0,0 @@
-Apache Isis
-Copyright 2010-2013 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/pom.xml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/pom.xml b/component/viewer/scimpi/dispatcher/pom.xml
deleted file mode 100644
index 3805c10..0000000
--- a/component/viewer/scimpi/dispatcher/pom.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-scimpi</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>isis-viewer-scimpi-dispatcher</artifactId>
-
- <name>Isis Scimpi Viewer Dispatcher</name>
-
- <properties>
- <siteBaseDir>..</siteBaseDir>
- <relativeUrl>dispatcher/</relativeUrl>
- </properties>
-
- <!-- used in Site generation for relative references. -->
- <url>http://isis.apache.org/${relativeUrl}</url>
-
- <reporting>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-project-info-reports-plugin</artifactId>
- <inherited>false</inherited>
- <configuration>
- <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
- </configuration>
- <reportSets>
- <reportSet>
- <inherited>false</inherited>
- <reports>
- <report>dependencies</report>
- <report>dependency-convergence</report>
- <report>plugins</report>
- <report>summary</report>
- </reports>
- </reportSet>
- </reportSets>
- </plugin>
- </plugins>
- </reporting>
-
- <dependencies>
-
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-runtime</artifactId>
- </dependency>
-
- <dependency>
- <groupId>dom4j</groupId>
- <artifactId>dom4j</artifactId>
- </dependency>
- <dependency>
- <groupId>org.json</groupId>
- <artifactId>json</artifactId>
- </dependency>
-
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.htmlparser</groupId>
- <artifactId>htmlparser</artifactId>
- </dependency>
-
- </dependencies>
-</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractElementProcessor.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractElementProcessor.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractElementProcessor.java
deleted file mode 100644
index 4869cc4..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractElementProcessor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import org.apache.isis.core.commons.config.ConfigurationConstants;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public abstract class AbstractElementProcessor implements ElementProcessor, Names {
-
- private static final String SHOW_ICONS_BY_DEFAULT = ConfigurationConstants.ROOT + "scimpi.show-icons";
-
- private final boolean showIconByDefault;
-
- public AbstractElementProcessor() {
- showIconByDefault = IsisContext.getConfiguration().getBoolean(SHOW_ICONS_BY_DEFAULT, false);
- }
-
- /**
- * Return the Class for the class specified in the type attribute.
- */
- protected Class<?> forClass(final Request request) {
- Class<?> cls = null;
- final String className = request.getOptionalProperty(TYPE);
- if (className != null) {
- try {
- cls = Class.forName(className);
- } catch (final ClassNotFoundException e) {
- throw new ScimpiException("No class for " + className, e);
- }
- }
- return cls;
- }
-
- protected boolean showIconByDefault() {
- return showIconByDefault;
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
deleted file mode 100644
index 97dd1ed..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public abstract class AbstractObjectProcessor extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String id = request.getOptionalProperty(OBJECT);
- ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
-
- final String field = request.getOptionalProperty(FIELD);
- if (field != null) {
- final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
- final String error = checkFieldType(objectField);
- if (error != null) {
- throw new ScimpiException("Field " + objectField.getId() + " " + error);
- }
- ResolveFieldUtil.resolveField(object, objectField);
- object = objectField.get(object);
- }
-
- process(request, object);
- }
-
- protected String checkFieldType(final ObjectAssociation objectField) {
- return null;
- }
-
- protected abstract void process(Request request, ObjectAdapter object);
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Action.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Action.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Action.java
deleted file mode 100644
index 7bd6b26..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Action.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import java.io.IOException;
-
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-
-public interface Action extends Names {
-
- void process(RequestContext context) throws IOException;
-
- String getName();
-
- void init();
-
- void debug(DebugBuilder debug);
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/BlockContent.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/BlockContent.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/BlockContent.java
deleted file mode 100644
index 836ae60..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/BlockContent.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-public interface BlockContent {
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/DispatchException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/DispatchException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/DispatchException.java
deleted file mode 100644
index cc679ae..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/DispatchException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-public class DispatchException extends ScimpiException {
- private static final long serialVersionUID = 1L;
-
- public DispatchException() {
- }
-
- public DispatchException(final String message) {
- super(message);
- }
-
- public DispatchException(final Throwable cause) {
- super(cause);
- }
-
- public DispatchException(final String message, final Throwable cause) {
- super(message, cause);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Dispatcher.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Dispatcher.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Dispatcher.java
deleted file mode 100644
index 82c67c1..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Dispatcher.java
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.Stack;
-import java.util.TimeZone;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.config.ConfigurationConstants;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.factory.InstanceUtil;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
-import org.apache.isis.viewer.scimpi.dispatcher.action.ActionAction;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Debug;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugAction;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugHtmlWriter;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUserAction;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsers;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.LogAction;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.EditAction;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.RemoveAction;
-import org.apache.isis.viewer.scimpi.dispatcher.logon.LogonAction;
-import org.apache.isis.viewer.scimpi.dispatcher.logon.LogoutAction;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Encoder;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.HtmlFileParser;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.ProcessorLookup;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.SimpleEncoder;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.TagProcessingException;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-import org.apache.isis.viewer.scimpi.dispatcher.view.Snippet;
-
-public class Dispatcher {
- private static final String SHOW_UNSHOWN_MESSAGES = ConfigurationConstants.ROOT + "scimpi.show-unshown-messages";
- public static final String ACTION = "_action";
- public static final String EDIT = "_edit";
- public static final String REMOVE = "_remove";
- public static final String GENERIC = "_generic";
- public static final String EXTENSION = "shtml";
- private static final Logger LOG = LoggerFactory.getLogger(Dispatcher.class);
- public static final String COMMAND_ROOT = ".app";
- private final Map<String, Action> actions = new HashMap<String, Action>();
- private final Map<String, String> parameters = new HashMap<String, String>();
- private final ProcessorLookup processors = new ProcessorLookup();
- private final HtmlFileParser parser = new HtmlFileParser(processors);
- private final Encoder encoder = new SimpleEncoder();
- private boolean showUnshownMessages;
-
- public void process(final RequestContext context, final String servletPath) {
- LOG.debug("processing request " + servletPath);
- final AuthenticationSession session = UserManager.startRequest(context);
- LOG.debug("exsiting session: " + session);
-
- String language = (String) context.getVariable("user-language");
- if (language != null) {
- Locale locale = Util.locale(language);
- TimeZone timeZone = Util.timeZone((String) context.getVariable("user-time-zone"));
- // IsisContext.getUserProfile().setLocalization(new UserLocalization(locale, timeZone));
- }
-
- IsisContext.getPersistenceSession().getTransactionManager().startTransaction();
- context.setRequestPath(servletPath);
- context.startRequest();
-
- try {
- processActions(context, false, servletPath);
- processTheView(context);
- } catch (final ScimpiNotFoundException e) {
- if (context.isInternalRequest()) {
- LOG.error("invalid page request (from within application): " + e.getMessage());
- ErrorCollator error = new ErrorCollator();
- error.missingFile("Failed to find page " + servletPath + ".");
- show500ErrorPage(context, e, error);
- } else {
- LOG.info("invalid page request (from outside application): " + e.getMessage());
- show404ErrorPage(context, servletPath);
- }
- } catch (final NotLoggedInException e) {
- redirectToLoginPage(context);
- } catch (final Throwable e) {
- ErrorCollator error = new ErrorCollator();
- final PersistenceSession checkSession = IsisContext.getPersistenceSession();
- final IsisTransactionManager transactionManager = checkSession.getTransactionManager();
- if (transactionManager.getTransaction() != null && transactionManager.getTransaction().getState().canAbort()) {
- transactionManager.abortTransaction();
- transactionManager.startTransaction();
- }
-
- final Throwable ex = e instanceof TagProcessingException ? e.getCause() : e;
- if (ex instanceof ForbiddenException) {
- LOG.error("invalid access to " + servletPath, e);
- show403ErrorPage(context, error, e, ex);
- } else {
- LOG.error("error procesing " + servletPath, e);
- if (context.getErrorMessage() != null) {
- fallbackToSimpleErrorPage(context, e);
- } else {
- show500ErrorPage(context, e, error);
- }
- }
- } finally {
- try {
- UserManager.endRequest(context.getSession());
- } catch (final Exception e1) {
- LOG.error("endRequest call failed", e1);
- }
- }
- }
-
- private void redirectToLoginPage(final RequestContext context) {
- IsisContext.getMessageBroker().addWarning(
- "You are not currently logged in! Please log in so you can continue.");
- context.setRequestPath("/login.shtml");
- try {
- processTheView(context);
- } catch (final IOException e1) {
- throw new ScimpiException(e1);
- }
- }
-
- private void show404ErrorPage(final RequestContext context, final String servletPath) {
- ErrorCollator error = new ErrorCollator();
- error.missingFile("Failed to find page " + servletPath + ".");
- context.raiseError(404, error);
- }
-
- private void show403ErrorPage(final RequestContext context, ErrorCollator error, final Throwable e, final Throwable ex) {
- DebugBuilder debug = error.getDebug();
- error.message(e);
- error.message(ex);
-
- final List<String> roles = ((ForbiddenException) ex).getRoles();
- final StringBuffer roleList = new StringBuffer();
- for (final String role : roles) {
- if (roleList.length() > 0) {
- roleList.append("|");
- }
- roleList.append(role);
- }
- final Identifier identifier = ((ForbiddenException) ex).getIdentifier();
- if (identifier != null) {
- debug.appendln("Class", identifier.toClassIdentityString() + ":" + roleList);
- debug.appendln("Member",identifier.toClassAndNameIdentityString() + ":" + roleList);
- debug.appendln("Other",identifier.toFullIdentityString() + ":" + roleList);
- }
-
- error.compileError(context);
- context.raiseError(403, error);
- }
-
- private void show500ErrorPage(final RequestContext context, final Throwable e, ErrorCollator error) {
- error.exception(e);
- error.compileError(context);
- context.raiseError(500, error);
- }
-
- private void fallbackToSimpleErrorPage(final RequestContext context, final Throwable e) {
- context.setContentType("text/html");
- final PrintWriter writer = context.getWriter();
- writer.write("<html><head><title>Error</title></head>");
- writer.write("<body><h1>Error</h1>");
- writer.write("<p>Error while processing error</p><pre>");
- e.printStackTrace(writer);
- writer.write("</pre></body></html>");
- writer.close();
- LOG.error("Error while processing error", e);
- }
-
- protected void processTheView(final RequestContext context) throws IOException {
- IsisTransactionManager transactionManager = IsisContext.getPersistenceSession().getTransactionManager();
- if (transactionManager.getTransaction().getState().canFlush()) {
- transactionManager.flushTransaction();
- }
- processView(context);
- // Note - the session will have changed since the earlier call if a user
- // has logged in or out in the action
- // processing above.
- transactionManager = IsisContext.getPersistenceSession().getTransactionManager();
- if (transactionManager.getTransaction().getState().canCommit()) {
- IsisContext.getPersistenceSession().getTransactionManager().endTransaction();
- }
-
- context.endRequest();
- UserManager.endRequest(context.getSession());
- }
-
- public void addParameter(final String name, final String value) {
- parameters.put(name, value);
- }
-
- private String getParameter(final String name) {
- return parameters.get(name);
- }
-
- private void processActions(final RequestContext context, final boolean userLoggedIn, final String actionName) throws IOException {
- if (actionName.endsWith(COMMAND_ROOT)) {
- final int pos = actionName.lastIndexOf('/');
- final Action action = actions.get(actionName.substring(pos, actionName.length() - COMMAND_ROOT.length()));
- if (action == null) {
- throw new ScimpiException("No logic for " + actionName);
- }
-
- LOG.debug("processing action: " + action);
- action.process(context);
- final String fowardTo = context.forwardTo();
- if (fowardTo != null) {
- processActions(context, true, fowardTo);
- }
- }
- }
-
- private void processView(final RequestContext context) throws IOException {
- String file = context.getRequestedFile();
- if (file == null) {
- LOG.warn("No view specified to process");
- return;
- }
- if (file.endsWith(COMMAND_ROOT)) {
- return;
- }
- file = determineFile(context, file);
- final String fullPath = context.requestedFilePath(file);
- LOG.debug("processing file " + fullPath);
- context.setResourcePath(fullPath);
-
- context.setContentType("text/html");
-
- context.addVariable("title", "Untitled Page", Scope.REQUEST);
- final Stack<Snippet> tags = loadPageTemplate(context, fullPath);
- final Request request = new Request(file, context, encoder, tags, processors);
- request.appendDebug("processing " + fullPath);
- try {
- request.processNextTag();
- noteIfMessagesHaveNotBeenDisplay(context);
- } catch (final RuntimeException e) {
- IsisContext.getMessageBroker().getMessages();
- IsisContext.getMessageBroker().getWarnings();
- throw e;
- }
- final String page = request.popBuffer();
- final PrintWriter writer = context.getWriter();
- writer.write(page);
- if (context.getDebug() == Debug.PAGE) {
- final DebugHtmlWriter view = new DebugHtmlWriter(writer, false);
- context.append(view);
- }
- }
-
- public void noteIfMessagesHaveNotBeenDisplay(final RequestContext context) {
- final List<String> messages = IsisContext.getMessageBroker().getMessages();
- if (showUnshownMessages) {
- if (messages.size() > 0) {
- context.getWriter().println("<ol class=\"messages forced\">");
- for (String message : messages) {
- context.getWriter().println("<li>" + message + "</li>");
- }
- context.getWriter().println("</ol>");
- }
- final List<String> warnings = IsisContext.getMessageBroker().getWarnings();
- if (warnings.size() > 0) {
- context.getWriter().println("<ol class=\"warnings forced\">");
- for (String message : warnings) {
- context.getWriter().println("<li>" + message + "</li>");
- }
- context.getWriter().println("</ol>");
- }
- }
- }
-
- private String determineFile(final RequestContext context, String file) {
- final String fileName = file.trim();
- if (fileName.startsWith(GENERIC)) {
- final Object result = context.getVariable(RequestContext.RESULT);
- final ObjectAdapter mappedObject = MethodsUtils.findObject(context, (String) result);
- if (mappedObject == null) {
- throw new ScimpiException("No object mapping for " + result);
- }
- if (fileName.equals(GENERIC + "." + EXTENSION)) {
- final Facet facet = mappedObject.getSpecification().getFacet(CollectionFacet.class);
- if (facet != null) {
- final ObjectSpecification specification = mappedObject.getSpecification();
- final TypeOfFacet facet2 = specification.getFacet(TypeOfFacet.class);
- file = findFileForSpecification(context, facet2.valueSpec(), "collection", EXTENSION);
- } else {
- final ObjectAdapter mappedObject2 = mappedObject;
- if (mappedObject2.isTransient()) {
- file = findFileForSpecification(context, mappedObject.getSpecification(), "edit", EXTENSION);
- } else {
- file = findFileForSpecification(context, mappedObject.getSpecification(), "object", EXTENSION);
- }
- }
- } else if (fileName.equals(GENERIC + EDIT + "." + EXTENSION)) {
- file = findFileForSpecification(context, mappedObject.getSpecification(), "edit", EXTENSION);
- } else if (fileName.equals(GENERIC + ACTION + "." + EXTENSION)) {
- final String method = context.getParameter("method");
- file = findFileForSpecification(context, mappedObject.getSpecification(), method, "action", EXTENSION);
- }
- }
- return file;
- }
-
- private String findFileForSpecification(final RequestContext context, final ObjectSpecification specification, final String name, final String extension) {
- return findFileForSpecification(context, specification, name, name, extension);
- }
-
- private String findFileForSpecification(final RequestContext context, final ObjectSpecification specification, final String name, final String defaultName, final String extension) {
-
- String find = findFile(context, specification, name, extension);
- if (find == null) {
- find = "/generic/" + defaultName + "." + extension;
- }
- return find;
- }
-
- private String findFile(final RequestContext context, final ObjectSpecification specification, final String name, final String extension) {
- final String className = specification.getShortIdentifier();
- String fileName = context.findFile("/" + className + "/" + name + "." + extension);
- if (fileName == null) {
- final List<ObjectSpecification> interfaces = specification.interfaces();
- for (int i = 0; i < interfaces.size(); i++) {
- fileName = findFile(context, interfaces.get(i), name, extension);
- if (fileName != null) {
- return fileName;
- }
- }
- if (specification.superclass() != null) {
- fileName = findFile(context, specification.superclass(), name, extension);
- }
- }
- return fileName;
- }
-
- private Stack<Snippet> loadPageTemplate(final RequestContext context, final String path) throws IOException, FileNotFoundException {
- // TODO cache stacks and check for them first
- copyParametersToVariableList(context);
- LOG.debug("parsing source " + path);
- return parser.parseHtmlFile(path, context);
- }
-
- private void copyParametersToVariableList(final RequestContext context) {
- /*
- * Enumeration parameterNames = context.getParameterNames(); while
- * (parameterNames.hasMoreElements()) { String name = (String)
- * parameterNames.nextElement(); if (!name.equals("view")) {
- * context.addVariable(name, context.getParameter(name), Scope.REQUEST);
- * } }
- */
- }
-
- public void init(final String dir, final DebugUsers debugUsers) {
- addAction(new ActionAction());
-
- // TODO remove
- addAction(new DebugAction(this));
- addAction(new DebugUserAction(debugUsers));
- addAction(new EditAction());
- addAction(new RemoveAction());
- addAction(new LogonAction());
- addAction(new LogoutAction());
- addAction(new LogAction());
-
- final String configFile = getParameter("config");
- if (configFile != null) {
- final File file = new File(dir, configFile);
- if (file.exists()) {
- loadConfigFile(file);
- } else {
- throw new ScimpiException("Configuration file not found: " + configFile);
- }
- }
-
- processors.init();
- processors.addElementProcessor(new org.apache.isis.viewer.scimpi.dispatcher.view.debug.Debug(this));
-
- showUnshownMessages = IsisContext.getConfiguration().getBoolean(SHOW_UNSHOWN_MESSAGES, true);
- }
-
- private void loadConfigFile(final File file) {
- try {
- Document document;
- final SAXReader reader = new SAXReader();
- document = reader.read(file);
- final Element root = document.getRootElement();
- for (final Iterator i = root.elementIterator(); i.hasNext();) {
- final Element element = (Element) i.next();
-
- if (element.getName().equals("actions")) {
- for (final Iterator actions = element.elementIterator("action"); actions.hasNext();) {
- final Element action = (Element) actions.next();
- final String className = action.getText();
- final Action instance = (Action) InstanceUtil.createInstance(className);
- addAction(instance);
- }
- }
-
- if (element.getName().equals("processors")) {
- for (final Iterator processors = element.elementIterator("processor"); processors.hasNext();) {
- final Element processor = (Element) processors.next();
- final String className = processor.getText();
- final ElementProcessor instance = (ElementProcessor) InstanceUtil.createInstance(className);
- this.processors.addElementProcessor(instance);
- }
- }
-
- }
- } catch (final DocumentException e) {
- throw new IsisException(e);
- }
-
- }
-
- private void addAction(final Action action) {
- actions.put("/" + action.getName(), action);
- action.init();
- }
-
- public void debug(final DebugBuilder debug) {
- debug.startSection("Actions");
- final Set<String> keySet = actions.keySet();
- final ArrayList<String> list = new ArrayList<String>(keySet);
- Collections.sort(list);
- for (final String name : list) {
- debug.appendln(name, actions.get(name));
- }
- /*
- * new ArrayList<E>(actions.keySet().iterator()) Iterator<String> names
- * = Collections.sort().iterator(); while (names.hasNext()) { String
- * name = names.next(); view.appendRow(name, actions.get(name)); }
- */
- final Iterator<Action> iterator = actions.values().iterator();
- while (iterator.hasNext()) {
- iterator.next().debug(debug);
- }
-
- processors.debug(debug);
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementContentProcessor.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementContentProcessor.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementContentProcessor.java
deleted file mode 100644
index eaae2ac..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementContentProcessor.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-public interface ElementContentProcessor extends ElementProcessor {
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementProcessor.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementProcessor.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementProcessor.java
deleted file mode 100644
index 471ac00..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementProcessor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public interface ElementProcessor {
-
- String getName();
-
- void process(Request request);
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ErrorCollator.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ErrorCollator.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ErrorCollator.java
deleted file mode 100644
index 97e297e..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ErrorCollator.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.PrintWriter;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.config.ConfigurationConstants;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.debug.DebugHtmlString;
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.commons.debug.DebugTee;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugHtmlWriter;
-
-public class ErrorCollator {
- private static final Logger LOG = LoggerFactory.getLogger(ErrorCollator.class);
-
- private String errorRef;
- private String message;
- private final DebugString debugText = new DebugString();
- private final DebugHtmlString debugHtml = new DebugHtmlString();
- private final DebugBuilder debug = new DebugTee(debugText, debugHtml);
-
- public void missingFile(String message) {
- this.message = message;
- }
-
- public void message(final Throwable exception) {
- LOG.debug(exception.getMessage(), exception);
- message = exception.getMessage();
- debug.appendPreformatted(message);
- }
-
- public void exception(final Throwable exception) {
- String messageText = exception.getMessage();
- LOG.debug(messageText, exception);
- try {
- debug.startSection("Exception");
- debug.appendException(exception);
- debug.endSection();
- } catch (final RuntimeException e) {
- debug.appendln("NOTE - an exception occurred while dumping an exception!");
- debug.appendException(e);
- }
- message = messageText == null ? exception.getClass().getName() : messageText;
- }
-
- public DebugBuilder getDebug() {
- return debug;
- }
-
- public void compileError(final RequestContext requestContext) {
- errorRef = Long.toString(System.currentTimeMillis(), 36).toUpperCase();
- LOG.info("error " + errorRef);
-
- captureWarningsAndMessages();
- dumpDebugDetails(requestContext);
- writeErrorFile();
- }
-
- private void captureWarningsAndMessages() {
- // Capture warnings/messages
- if (IsisContext.getCurrentTransaction() != null) {
- final List<String> messages = IsisContext.getMessageBroker().getMessages();
- final List<String> warnings = IsisContext.getMessageBroker().getWarnings();
- if (messages.size() > 0 || messages.size() > 0) {
- debug.startSection("Warnings/Messages");
- for (final String message : messages) {
- debug.appendln("message", message);
- }
- for (final String message : warnings) {
- debug.appendln("warning", message);
- }
- }
- }
- }
-
- private void dumpDebugDetails(final RequestContext requestContext) {
- // Dump page debug details
- requestContext.append(debug);
-
- debug.startSection("Processing Trace");
- debug.appendPreformatted(requestContext.getDebugTrace());
- debug.endSection();
- debug.close();
- }
-
- private void writeErrorFile() {
- LOG.error(message + "\n" + debugText.toString());
-
-
- PrintWriter writer;
- try {
- final String directory =
- IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.error-snapshots", ".");
- File dir = new File(directory);
- if (!dir.exists()) {
- dir.mkdirs();
- }
- writer = new PrintWriter(new File(dir, "error_" + errorRef + ".html"));
- final DebugHtmlWriter writer2 = new DebugHtmlWriter(writer, true);
- writer2.concat(debugHtml);
- writer2.close();
- writer.close();
- } catch (final FileNotFoundException e) {
- LOG.error("Failed to archive error page", e);
- }
- }
-
- public String getReference() {
- return errorRef;
- }
-
- public String getDetails() {
- return debugHtml.toString();
- }
-
- public String getMessage() {
- return message;
- }
-
-
-}
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ForbiddenException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ForbiddenException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ForbiddenException.java
deleted file mode 100644
index 32d0c0c..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ForbiddenException.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import java.util.List;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-
-/**
- * Indicates that request could not complete as it could not access (for
- * security reasons) some of the content.
- */
-public class ForbiddenException extends ScimpiException {
- private static final long serialVersionUID = 1L;
- public static final boolean VISIBLE_AND_USABLE = true;
- public static final boolean VISIBLE = false;
- private final Identifier identifier;
- private final AuthenticationSession session;
-
- public ForbiddenException(final String message) {
- this(IsisContext.getAuthenticationSession(), message);
- }
-
- private ForbiddenException(final AuthenticationSession session, final String message) {
- super(message + " for " + session.getUserName() + " " + session.getRoles());
- this.session = session;
- identifier = null;
- }
-
- public ForbiddenException(final IdentifiedHolder target, final boolean isVisibleAndUsabable) {
- this(target.getIdentifier(), IsisContext.getAuthenticationSession(), isVisibleAndUsabable);
- }
-
- private ForbiddenException(final Identifier identifier, final AuthenticationSession session, final boolean isVisibleAndUsabable) {
- super((identifier.getType() == Identifier.Type.PROPERTY_OR_COLLECTION ? "Field" : "Action") + " '" + identifier.getMemberName() + "' in " + identifier.getClassName() + " is not " + (isVisibleAndUsabable ? "visible/usable " : "visible") + " for " + session.getUserName() + " "
- + session.getRoles());
- this.identifier = identifier;
- this.session = session;
- }
-
- public Identifier getIdentifier() {
- return identifier;
- }
-
- public List<String> getRoles() {
- return session.getRoles();
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Names.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Names.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Names.java
deleted file mode 100644
index 29b15e5..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Names.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-public interface Names {
- static final String PREFIX = "_logon-";
-
- static final String BUTTON_TITLE = "button-title";
- static final String CANCEL_TO = "cancel-to";
- static final String COLLECTION = "collection";
- static final String CONFIRM = "confirm";
- static final String CLASS = "class";
- static final String CONTAINER_CLASS = "container-" + CLASS;
- static final String DEFAULT = "default";
- static final String ELEMENT_NAME = "element-name";
- static final String ELEMENT = "element";
- static final String EVEN_ROW_CLASS = "even-row";
- static final String FALSE = "false";
- static final String ERROR = "error";
- static final String FIELD = "field";
- static final String FIELD_NAME = "field-name";
- static final String FOOTER = "footer";
- static final String FORM_ID = "form-id";
- static final String FORM_TITLE = "title";
- static final String FORMS = "show-forms";
- static final String HEADER = "header";
- static final String ICON_CLASS = "icon";
- static final String HIDDEN = "hidden";
- static final String HIDE_UNEDITABLE = "hide-uneditable";
- static final String HEADER_LEVEL = "header";
- static final String ID = "id";
- static final String LABEL_DELIMITER = "label";
- static final String LINK_VIEW = "link-view";
- static final String LINK_NAME = "link-name";
- static final String LINK_OBJECT = "link-object";
- static final String METHOD = "method";
- static final String MESSAGE = "message";
- static final String NAME = "name";
- static final String ODD_ROW_CLASS = "odd-row";
- static final String OBJECT = "object";
- static final String PARAMETER = "param";
- static final String PARAMETER_NUMBER = "number";
- static final String PLURAL = "plural";
- static final String REFERENCE_NAME = "reference-name";
- static final String RESULT_NAME = "result-name";
- static final String RESULT_OVERRIDE = "result-override";
- static final String ROW_CLASSES = "row-classes";
- static final String SCOPE = "scope";
- static final String SHOW_ICON = "icon";
- static final String SHOW_SELECT = "select";
- static final String SHOW_EDIT = "edit";
- static final String SHOW_DELETE = "delete";
- static final String SHOW_MESSAGE = "show-message";
- static final String SHOW_TITLE = "show-title";
- static final String TRUNCATE = "truncate";
- static final String TABLE_TITLE = "title";
- static final String TYPE = "type";
- static final String VIEW = "view";
- static final String VALUE = "value";
- static final String VERSION = "version";
- static final String USER = "user";
- static final String VOID = "void";
- static final String WHEN = "when";
- static final String ENTRY_FIELDS = "entry-fields";
-
-
- static final String LOGON_OBJECT = PREFIX + OBJECT;
- static final String LOGON_METHOD = PREFIX + METHOD;
- static final String LOGON_SCOPE = PREFIX + SCOPE;
- static final String LOGON_RESULT_NAME = PREFIX + RESULT_NAME;
- static final String LOGON_FORM_ID = PREFIX + "form-id";
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/NotLoggedInException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/NotLoggedInException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/NotLoggedInException.java
deleted file mode 100644
index 9cd54a3..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/NotLoggedInException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-/**
- * Indicates that request could not complete as a user was not logged in.
- */
-public class NotLoggedInException extends ScimpiException {
- private static final long serialVersionUID = 1L;
-
- public NotLoggedInException() {
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java
deleted file mode 100644
index a0ae5cf..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-
-public final class ResolveFieldUtil {
-
- private ResolveFieldUtil(){}
-
- /**
- * Walking the graph.
- *
- * <p>
- * This combines the implementations of both the DN Objectstore
- * and also the in-memory objectstore.
- * </p>
- */
- public static void resolveField(final ObjectAdapter object, final ObjectAssociation association) {
-
-
- // DN impl.
- {
- final ObjectAdapter referencedCollectionAdapter = association.get(object);
-
- // this code originally brought in from the JPA impl, but seems reasonable.
- if (association.isOneToManyAssociation()) {
- ensureThatState(referencedCollectionAdapter, is(notNullValue()));
-
- final Object referencedCollection = referencedCollectionAdapter.getObject();
- ensureThatState(referencedCollection, is(notNullValue()));
-
- // if a proxy collection, then force it to initialize. just 'touching' the object is sufficient.
- // REVIEW: I wonder if this is actually needed; does JDO use proxy collections?
- referencedCollection.hashCode();
- }
-
- // the JPA impl used to also call its lifecycle listener on the referenced collection object, eg List,
- // itself. I don't think this makes sense to do for JDO (the collection is not a PersistenceCapable).
- }
-
- // In-memory objectstore impl
- {
- final ObjectAdapter referenceAdapter = association.get(object);
- referenceAdapter.markAsResolvedIfPossible();
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiException.java
deleted file mode 100644
index 18e7646..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher;
-
-public class ScimpiException extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- public ScimpiException() {
- }
-
- public ScimpiException(final String message) {
- super(message);
- }
-
- public ScimpiException(final Throwable cause) {
- super(cause);
- }
-
- public ScimpiException(final String message, final Throwable cause) {
- super(message, cause);
- }
-
- public String getHtmlMessage() {
- return getMessage();
- }
-
-}
[26/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/vendor.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/vendor.css b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/vendor.css
new file mode 100644
index 0000000..53fad89
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/vendor.css
@@ -0,0 +1,8 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset]
,input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{
page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:focus,a:hover{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0
}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{f
ont-weight:400;line-height:1;color:#999}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{col
or:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857
143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.
pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inher
it;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,
.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-p
ush-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8
{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-of
fset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.co
l-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-m
d-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4
{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-l
g-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.tabl
e-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody
>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th
,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hov
er>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bord
ered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-
box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075
),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.checkbox,.radio{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.checkbox label,.radio label{display:inline;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{float:left;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;v
ertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline[disabled],.checkbox[disabled],.radio-inline[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-contr
ol-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1
px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{colo
r:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizonta
l .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active:focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowe
d;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default:active,.btn-default:focus,.btn-default:hover,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default.active,.btn-default:active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primar
y{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary.active,.btn-primary:active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success:act
ive,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;
border-color:#269abc}.btn-info.active,.btn-info:active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning
.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-da
nger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padd
ing:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-hal
flings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-t
h:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{cont
ent:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"
}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyp
hicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:befor
e{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.gly
phicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-
order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\
e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphic
on-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;
background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#999}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom
.dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.
dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px
rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-gr
oup-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-
group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,sele
ct[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]
{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.i
nput-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42
857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-jus
tified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.ac
tive>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .nav
bar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-
brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-me
nu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form
.radio{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;mar
gin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-
toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-
default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-
bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-na
v .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-righ
t-radius:4px;border-top-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-rig
ht-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;
white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:focus,.label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:focus,.label-default[href]:hover{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:70
0;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.nav-pills>.active>a>.badge,a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;borde
r:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;
color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45d
eg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped
.progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,tran
sparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.
badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:focus,a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:focus .list-group-item-text,a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.ac
tive,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.
list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.pa
nel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:fir
st-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbod
y:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>
tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.pan
el>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-c
hild,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th
,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.pa
nel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.
panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-
height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:
1px solid rgba(0,0,0,.2);
<TRUNCATED>
[07/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionForm.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionForm.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionForm.java
new file mode 100644
index 0000000..469b99d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionForm.java
@@ -0,0 +1,262 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.action;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.action.ActionAction;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+import org.apache.isis.viewer.scimpi.dispatcher.view.edit.FieldFactory;
+import org.apache.isis.viewer.scimpi.dispatcher.view.edit.FormFieldBlock;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.HiddenInputField;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.HtmlFormBuilder;
+import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
+
+public class ActionForm extends AbstractElementProcessor {
+
+ // REVIEW: confirm this rendering context
+ private final static Where where = Where.OBJECT_FORMS;
+
+ @Override
+ public void process(final Request request) {
+ final CreateFormParameter parameters = new CreateFormParameter();
+ parameters.objectId = request.getOptionalProperty(OBJECT);
+ parameters.methodName = request.getRequiredProperty(METHOD);
+ parameters.forwardResultTo = request.getOptionalProperty(VIEW);
+ parameters.forwardVoidTo = request.getOptionalProperty(VOID);
+ parameters.forwardErrorTo = request.getOptionalProperty(ERROR);
+ parameters.cancelTo = request.getOptionalProperty(CANCEL_TO);
+ parameters.showIcon = request.isRequested(SHOW_ICON, showIconByDefault());
+ parameters.buttonTitle = request.getOptionalProperty(BUTTON_TITLE);
+ parameters.formTitle = request.getOptionalProperty(FORM_TITLE);
+ parameters.labelDelimiter = request.getOptionalProperty(LABEL_DELIMITER, ":");
+ parameters.formId = request.getOptionalProperty(FORM_ID, request.nextFormId());
+ parameters.resultName = request.getOptionalProperty(RESULT_NAME);
+ parameters.resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
+ parameters.scope = request.getOptionalProperty(SCOPE);
+ parameters.className = request.getOptionalProperty(CLASS, "action full");
+ parameters.showMessage = request.isRequested(SHOW_MESSAGE, false);
+ parameters.completionMessage = request.getOptionalProperty(MESSAGE);
+ parameters.id = request.getOptionalProperty(ID, parameters.methodName);
+ createForm(request, parameters);
+ }
+
+ public static void createForm(final Request request, final CreateFormParameter parameterObject) {
+ createForm(request, parameterObject, false);
+ }
+
+ protected static void createForm(final Request request, final CreateFormParameter parameterObject, final boolean withoutProcessing) {
+ final RequestContext context = request.getContext();
+ final ObjectAdapter object = MethodsUtils.findObject(context, parameterObject.objectId);
+ final String version = request.getContext().mapVersion(object);
+ final ObjectAction action = MethodsUtils.findAction(object, parameterObject.methodName);
+ // TODO how do we distinguish between overloaded methods?
+
+ // REVIEW Is this useful?
+ if (action.getParameterCount() == 0) {
+ throw new ScimpiException("Action form can only be used for actions with parameters");
+ }
+ if (parameterObject.showMessage && MethodsUtils.isVisible(object, action, where)) {
+ final String notUsable = MethodsUtils.isUsable(object, action, where);
+ if (notUsable != null) {
+ if (!withoutProcessing) {
+ request.skipUntilClose();
+ }
+ request.appendHtml("<div class=\"" + parameterObject.className + "-message\" >");
+ request.appendAsHtmlEncoded(notUsable);
+ request.appendHtml("</div>");
+ return;
+ }
+ }
+ if (!MethodsUtils.isVisibleAndUsable(object, action, where)) {
+ if (!withoutProcessing) {
+ request.skipUntilClose();
+ }
+ return;
+ }
+ final String objectId = context.mapObject(object, Scope.INTERACTION);
+ final String errorView = context.fullFilePath(parameterObject.forwardErrorTo == null ? context.getResourceFile() : parameterObject.forwardErrorTo);
+ final String voidView = context.fullFilePath(parameterObject.forwardVoidTo == null ? context.getResourceFile() : parameterObject.forwardVoidTo);
+ if (false /* action.isContributed() && !action.hasReturn() && parameterObject.resultOverride == null */) {
+ parameterObject.resultOverride = objectId;
+ }
+ final HiddenInputField[] hiddenFields = new HiddenInputField[] { new HiddenInputField("_" + OBJECT, objectId), new HiddenInputField("_" + VERSION, version), new HiddenInputField("_" + FORM_ID, parameterObject.formId), new HiddenInputField("_" + METHOD, parameterObject.methodName),
+ parameterObject.forwardResultTo == null ? null : new HiddenInputField("_" + VIEW, context.fullFilePath(parameterObject.forwardResultTo)), new HiddenInputField("_" + VOID, voidView), new HiddenInputField("_" + ERROR, errorView),
+ parameterObject.completionMessage == null ? null : new HiddenInputField("_" + MESSAGE, parameterObject.completionMessage), parameterObject.scope == null ? null : new HiddenInputField("_" + SCOPE, parameterObject.scope),
+ parameterObject.resultOverride == null ? null : new HiddenInputField("_" + RESULT_OVERRIDE, parameterObject.resultOverride), parameterObject.resultName == null ? null : new HiddenInputField("_" + RESULT_NAME, parameterObject.resultName),
+ parameterObject.resultName == null ? null : new HiddenInputField(RequestContext.RESULT, (String) request.getContext().getVariable(RequestContext.RESULT)) };
+
+ // TODO when the block contains a selector tag it doesn't disable it if
+ // the field cannot be edited!!!
+ final FormFieldBlock containedBlock = new FormFieldBlock() {
+ @Override
+ public boolean isNullable(final String name) {
+ final int index = Integer.parseInt(name.substring(5)) - 1;
+ final ObjectActionParameter param = action.getParameters().get(index);
+ return param.isOptional();
+ }
+ };
+ request.setBlockContent(containedBlock);
+ if (!withoutProcessing) {
+ request.processUtilCloseTag();
+ }
+
+ final FormState entryState = (FormState) context.getVariable(ENTRY_FIELDS);
+
+ // TODO the list of included fields should be considered in the next
+ // method (see EditObject)
+ final InputField[] formFields = createFields(action, object);
+ containedBlock.hideExcludedParameters(formFields);
+ containedBlock.setUpValues(formFields);
+ initializeFields(context, object, action, formFields);
+ setDefaults(context, object, action, formFields, entryState, parameterObject.showIcon);
+ String errors = null;
+ if (entryState != null && entryState.isForForm(parameterObject.formId)) {
+ copyEntryState(context, object, action, formFields, entryState);
+ errors = entryState.getError();
+ }
+ overrideWithHtml(context, containedBlock, formFields);
+
+ String formTitle;
+ if (parameterObject.formTitle == null) {
+ formTitle = action.getName();
+ } else {
+ formTitle = parameterObject.formTitle;
+ }
+
+ String buttonTitle = parameterObject.buttonTitle;
+ if (buttonTitle == null) {
+ buttonTitle = action.getName();
+ } else if (buttonTitle.equals("")) {
+ buttonTitle = "Ok";
+ }
+
+ HtmlFormBuilder.createForm(request, ActionAction.ACTION + ".app", hiddenFields, formFields, parameterObject.className,
+ parameterObject.id, formTitle, parameterObject.labelDelimiter, action.getDescription(), action.getHelp(), buttonTitle, errors, parameterObject.cancelTo);
+
+ request.popBlockContent();
+ }
+
+ private static InputField[] createFields(final ObjectAction action, final ObjectAdapter object) {
+ final int parameterCount = action.getParameterCount();
+ final InputField[] fields = new InputField[parameterCount];
+ for (int i = 0; i < fields.length; i++) {
+ fields[i] = new InputField(ActionAction.parameterName(i));
+ }
+ return fields;
+ }
+
+ private static void initializeFields(final RequestContext context, final ObjectAdapter object, final ObjectAction action, final InputField[] fields) {
+ final List<ObjectActionParameter> parameters = action.getParameters();
+ for (int i = 0; i < fields.length; i++) {
+ final InputField field = fields[i];
+ final ObjectActionParameter param = parameters.get(i);
+ if (false /*action.isContributed() && i == 0*/) {
+ // fields[i].setValue(context.mapObject(object,
+ // Scope.INTERACTION));
+ fields[i].setType(InputField.REFERENCE);
+ fields[i].setHidden(true);
+ } else {
+
+ fields[i].setHelpReference("xxxhelp");
+ final ObjectAdapter[] optionsForParameter = action.getChoices(object)[i];
+ FieldFactory.initializeField(context, object, param, optionsForParameter, !param.isOptional(), field);
+ }
+ }
+ }
+
+ /**
+ * Sets up the fields with their initial values
+ *
+ * @param showIcon
+ */
+ private static void setDefaults(final RequestContext context, final ObjectAdapter object, final ObjectAction action, final InputField[] fields, final FormState entryState, final boolean showIcon) {
+ final ObjectAdapter[] defaultValues = action.getDefaults(object);
+ if (defaultValues == null) {
+ return;
+ }
+
+ for (int i = 0; i < fields.length; i++) {
+ final InputField field = fields[i];
+ final ObjectAdapter defaultValue = defaultValues[i];
+
+ final String title = defaultValue == null ? "" : defaultValue.titleString();
+ if (field.getType() == InputField.REFERENCE) {
+ final ObjectSpecification objectSpecification = action.getParameters().get(i).getSpecification();
+ if (defaultValue != null) {
+ final String imageSegment = showIcon ? "<img class=\"small-icon\" src=\"" + context.imagePath(objectSpecification) + "\" alt=\"" + objectSpecification.getShortIdentifier() + "\"/>" : "";
+ final String html = imageSegment + title;
+ final String value = context.mapObject(defaultValue, Scope.INTERACTION);
+ field.setValue(value);
+ field.setHtml(html);
+ }
+ } else {
+ field.setValue(title);
+ }
+ }
+ }
+
+ private static void copyEntryState(final RequestContext context, final ObjectAdapter object, final ObjectAction action, final InputField[] fields, final FormState entryState) {
+
+ for (final InputField field : fields) {
+ final FieldEditState fieldState = entryState.getField(field.getName());
+ if (fieldState != null) {
+ if (field.isEditable()) {
+ String entry;
+ entry = fieldState.getEntry();
+ field.setValue(entry);
+ }
+
+ field.setErrorText(fieldState.getError());
+ }
+ }
+ }
+
+ private static void overrideWithHtml(final RequestContext context, final FormFieldBlock containedBlock, final InputField[] formFields) {
+ for (int i = 0; i < formFields.length; i++) {
+ final String id = ActionAction.parameterName(i);
+ if (containedBlock.hasContent(id)) {
+ final String content = containedBlock.getContent(id);
+ if (content != null) {
+ formFields[i].setHtml(content);
+ formFields[i].setType(InputField.HTML);
+ }
+ }
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "action-form";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionLink.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionLink.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionLink.java
new file mode 100644
index 0000000..520e2bc
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionLink.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.action;
+
+import java.net.URLEncoder;
+
+import org.apache.commons.lang.StringEscapeUtils;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
+
+public class ActionLink extends AbstractElementProcessor {
+
+ // REVIEW: confirm this rendering context
+ private final Where where = Where.OBJECT_FORMS;
+
+ @Override
+ public void process(final Request request) {
+ String objectId = request.getOptionalProperty(OBJECT);
+ final String method = request.getOptionalProperty(METHOD);
+ final String forwardResultTo = request.getOptionalProperty(VIEW);
+ final String forwardVoidTo = request.getOptionalProperty(VOID);
+ String resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
+
+ final String resultName = request.getOptionalProperty(RESULT_NAME);
+ final String resultNameSegment = resultName == null ? "" : "&" + RESULT_NAME + "=" + resultName;
+ final String scope = request.getOptionalProperty(SCOPE);
+ final String scopeSegment = scope == null ? "" : "&" + SCOPE + "=" + scope;
+ final String confirm = request.getOptionalProperty(CONFIRM);
+ final String completionMessage = request.getOptionalProperty(MESSAGE);
+ final String idName = request.getOptionalProperty(ID, method);
+ final String className = request.getOptionalProperty(CLASS);
+
+
+ // TODO need a mechanism for globally dealing with encoding; then use
+ // the new encode method
+ final String confirmSegment = confirm == null ? "" : "&" + "_" + CONFIRM + "=" + URLEncoder.encode(confirm);
+ final String messageSegment = completionMessage == null ? "" : "&" + "_" + MESSAGE + "=" + URLEncoder.encode(completionMessage);
+
+ final RequestContext context = request.getContext();
+ final ObjectAdapter object = MethodsUtils.findObject(context, objectId);
+ final String version = context.mapVersion(object);
+ final ObjectAction action = MethodsUtils.findAction(object, method);
+
+ final ActionContent parameterBlock = new ActionContent(action);
+ request.setBlockContent(parameterBlock);
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String text = request.popBuffer();
+
+ final String[] parameters = parameterBlock.getParameters();
+ final String target;
+ /*
+ if (action.isContributed()) {
+ System.arraycopy(parameters, 0, parameters, 1, parameters.length - 1);
+ parameters[0] = request.getContext().mapObject(object, Scope.REQUEST);
+ target = request.getContext().mapObject(action.realTarget(object), Scope.REQUEST);
+ if (!action.hasReturn() && resultOverride == null) {
+ resultOverride = parameters[0];
+ }
+ } else {
+ target = StringEscapeUtils.escapeHtml(request.getContext().mapObject(object, Scope.INTERACTION));
+ }
+ */
+
+ final ObjectAdapter[] objectParameters;
+
+ // TODO copied from ActionButton
+ //final ObjectAdapter target;
+ if (false /*action.isContributed() */) {
+// objectParameters= null;
+// System.arraycopy(parameters, 0, parameters, 1, parameters.length - 1);
+// parameters[0] = request.getContext().mapObject(object, Scope.REQUEST);
+// target = request.getContext().mapObject(action.realTarget(object), Scope.REQUEST);
+// if (!action.hasReturn() && resultOverride == null) {
+// resultOverride = parameters[0];
+// }
+ } else {
+ objectParameters = new ObjectAdapter[parameters.length];
+ // target = object;
+ target = StringEscapeUtils.escapeHtml(request.getContext().mapObject(object, Scope.INTERACTION));
+ int i = 0;
+ for (final ObjectActionParameter spec : action.getParameters()) {
+ final ObjectSpecification type = spec.getSpecification();
+ if (parameters[i] == null) {
+ objectParameters[i] = null;
+ } else if (type.getFacet(ParseableFacet.class) != null) {
+ final ParseableFacet facet = type.getFacet(ParseableFacet.class);
+ Localization localization = IsisContext.getLocalization();
+ objectParameters[i] = facet.parseTextEntry(null, parameters[i], localization);
+ } else {
+ objectParameters[i] = MethodsUtils.findObject(request.getContext(), parameters[i]);
+ }
+ i++;
+ }
+ }
+
+ if (MethodsUtils.isVisibleAndUsable(object, action, where) && MethodsUtils.canRunMethod(object, action, objectParameters).isAllowed()) {
+ writeLink(request, idName, className, target, version, method, forwardResultTo, forwardVoidTo, resultNameSegment, resultOverride, scopeSegment,
+ confirmSegment, messageSegment, context, action, parameters, text);
+ }
+ request.popBlockContent();
+ }
+
+ public static void writeLink(
+ final Request request,
+ final String idName,
+ final String className,
+ final String objectId,
+ final String version,
+ final String method,
+ final String forwardResultTo,
+ final String forwardVoidTo,
+ final String resultNameSegment,
+ final String resultOverride,
+ final String scopeSegment,
+ final String confirmSegment,
+ final String messageSegment,
+ final RequestContext context,
+ final ObjectAction action,
+ final String[] parameters,
+ String text) {
+ text = text == null || text.trim().equals("") ? action.getName() : text;
+
+ String parameterSegment = "";
+ for (int i = 0; i < parameters.length; i++) {
+ parameterSegment += "¶m" + (i + 1) + "=" + parameters[i];
+ }
+
+ final String idSegment = idName == null ? "" : ("id=\"" + idName + "\" ");
+ final String classSegment = "class=\"" + (className == null ? "action in-line" : className) + "\"";
+ final String interactionParamters = context.encodedInteractionParameters();
+ final String forwardResultSegment = forwardResultTo == null ? "" : "&" + "_" + VIEW + "=" + context.fullFilePath(forwardResultTo);
+ final String resultOverrideSegment = resultOverride == null ? "" : "&" + "_" + RESULT_OVERRIDE + "=" + resultOverride;
+ final String voidView = context.fullFilePath(forwardVoidTo == null ? context.getResourceFile() : forwardVoidTo);
+ final String forwardVoidSegment = "&" + "_" + VOID + "=" + voidView;
+ request.appendHtml("<a " + idSegment + classSegment + " href=\"action.app?" + "_" + OBJECT + "=" + objectId + "&" + "_" + VERSION + "=" + version
+ + "&" + "_" + METHOD + "=" + method + resultOverrideSegment + forwardResultSegment + forwardVoidSegment + resultNameSegment
+ + parameterSegment + scopeSegment + confirmSegment + messageSegment + interactionParamters + "\">");
+ request.appendHtml(text);
+ request.appendHtml("</a>");
+ HelpLink.append(request, action.getDescription(), action.getHelp());
+ }
+
+ @Override
+ public String getName() {
+ return "action-link";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/CreateFormParameter.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/CreateFormParameter.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/CreateFormParameter.java
new file mode 100644
index 0000000..2628449
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/CreateFormParameter.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.action;
+
+public class CreateFormParameter {
+ public String methodName;
+ public String forwardResultTo;
+ public String forwardVoidTo;
+ public String forwardErrorTo;
+ public String buttonTitle;
+ public String formTitle;
+ public String formId;
+ public String resultName;
+ public String scope;
+ public String objectId;
+ public String description;
+ public String helpReference;
+ public String className;
+ public String id;
+ public String resultOverride;
+ public boolean showMessage;
+ public boolean showIcon;
+ public String completionMessage;
+ public String cancelTo;
+ public String labelDelimiter;
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
new file mode 100644
index 0000000..21cff4e
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.action;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.InclusionList;
+
+public class Methods extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final static Where where = Where.ANYWHERE;
+
+ @Override
+ public void process(final Request request) {
+ String objectId = request.getOptionalProperty(OBJECT);
+ final String view = request.getOptionalProperty(VIEW, "_generic_action." + Dispatcher.EXTENSION);
+ final String cancelTo = request.getOptionalProperty(CANCEL_TO);
+ final boolean showForms = request.isRequested(FORMS, false);
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
+ if (objectId == null) {
+ objectId = request.getContext().mapObject(object, null);
+ }
+
+ final InclusionList inclusionList = new InclusionList();
+ request.setBlockContent(inclusionList);
+ request.processUtilCloseTag();
+
+ request.appendHtml("<div class=\"actions\">");
+ if (inclusionList.includes("edit") && !object.getSpecification().isService()) {
+ request.appendHtml("<div class=\"action\">");
+ request.appendHtml("<a class=\"button\" href=\"_generic_edit." + Dispatcher.EXTENSION + "?_result=" + objectId + "\">Edit...</a>");
+ request.appendHtml("</div>");
+ }
+ writeMethods(request, objectId, object, showForms, inclusionList, view, "_generic.shtml?_result=" + objectId);
+ request.popBlockContent();
+ request.appendHtml("</div>");
+ }
+
+ public static void writeMethods(
+ final Request request,
+ final String objectId,
+ final ObjectAdapter adapter,
+ final boolean showForms,
+ final InclusionList inclusionList,
+ final String view,
+ final String cancelTo) {
+ List<ObjectAction> actions = adapter.getSpecification().getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
+ writeMethods(request, adapter, actions, objectId, showForms, inclusionList, view, cancelTo);
+ // TODO determine if system is set up to display exploration methods
+ if (true) {
+ actions = adapter.getSpecification().getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED, Filters.<ObjectAction>any());
+ writeMethods(request, adapter, actions, objectId, showForms, inclusionList, view, cancelTo);
+ }
+ // TODO determine if system is set up to display debug methods
+ if (true) {
+ actions = adapter.getSpecification().getObjectActions(ActionType.DEBUG, Contributed.INCLUDED, Filters.<ObjectAction>any());
+ writeMethods(request, adapter, actions, objectId, showForms, inclusionList, view, cancelTo);
+ }
+ }
+
+ private static void writeMethods(
+ final Request request,
+ final ObjectAdapter adapter,
+ List<ObjectAction> actions,
+ final String objectId,
+ final boolean showForms,
+ final InclusionList inclusionList,
+ final String view,
+ final String cancelTo) {
+ actions = inclusionList.includedActions(actions);
+ for (int j = 0; j < actions.size(); j++) {
+ final ObjectAction action = actions.get(j);
+ if (false /* action instanceof ObjectActionSet */) {
+// request.appendHtml("<div class=\"actions\">");
+// writeMethods(request, adapter, action.getActions(), objectId, showForms, inclusionList, view, cancelTo);
+// request.appendHtml("</div>");
+ } else if (false /*action.isContributed()*/) {
+// if (action.getParameterCount() == 1 && adapter.getSpecification().isOfType(action.getParameters().get(0).getSpecification())) {
+// if (objectId != null) {
+// final ObjectAdapter target = request.getContext().getMappedObject(objectId);
+// final ObjectAdapter realTarget = action.realTarget(target);
+// final String realTargetId = request.getContext().mapObject(realTarget, Scope.INTERACTION);
+// writeMethod(request, adapter, new String[] { objectId }, action, realTargetId, showForms, view, cancelTo);
+// } else {
+// request.appendHtml("<div class=\"action\">");
+// request.appendAsHtmlEncoded(action.getName());
+// request.appendHtml("???</div>");
+// }
+// } else if (!adapter.getSpecification().isService()) {
+// writeMethod(request, adapter, new String[0], action, objectId, showForms, view, cancelTo);
+// }
+ } else {
+ writeMethod(request, adapter, new String[0], action, objectId, showForms, view, cancelTo);
+ }
+ }
+ }
+
+ private static void writeMethod(
+ final Request request,
+ final ObjectAdapter adapter,
+ final String[] parameters,
+ final ObjectAction action,
+ final String objectId,
+ final boolean showForms,
+ final String view,
+ final String cancelTo) {
+ // if (action.isVisible(IsisContext.getSession(), null) &&
+ // action.isVisible(IsisContext.getSession(), adapter))
+ // {
+ if (action.isVisible(IsisContext.getAuthenticationSession(), adapter, where).isAllowed()) {
+ request.appendHtml("<div class=\"action\">");
+ if (IsisContext.getSession() == null) {
+ request.appendHtml("<span class=\"disabled\" title=\"no user logged in\">");
+ request.appendAsHtmlEncoded(action.getName());
+ request.appendHtml("</span>");
+ /*
+ * } else if (action.isUsable(IsisContext.getSession(),
+ * null).isVetoed()) {
+ * request.appendHtml("<span class=\"disabled\" title=\"" +
+ * action.isUsable(IsisContext.getSession(), null).getReason() +
+ * "\">"); request.appendHtml(action.getName());
+ * request.appendHtml("</span>");
+ */} else if (action.isUsable(IsisContext.getAuthenticationSession(), adapter, where).isVetoed()) {
+ request.appendHtml("<span class=\"disabled\" title=\"" + action.isUsable(IsisContext.getAuthenticationSession(), adapter, where).getReason() + "\">");
+ request.appendAsHtmlEncoded(action.getName());
+ request.appendHtml("</span>");
+ } else {
+ final String version = request.getContext().mapVersion(adapter);
+ if (action.getParameterCount() == 0 || (false /*action.isContributed() && action.getParameterCount() == 1*/ )) {
+ ActionButton.write(request, adapter, action, parameters, version, "_generic." + Dispatcher.EXTENSION, null, null, null, null, null, null, null, null, null);
+ } else if (showForms) {
+ final CreateFormParameter params = new CreateFormParameter();
+ params.objectId = objectId;
+ params.methodName = action.getId();
+ params.forwardResultTo = "_generic." + Dispatcher.EXTENSION;
+ params.buttonTitle = "OK";
+ params.formTitle = action.getName();
+ ActionForm.createForm(request, params, true);
+ } else {
+ request.appendHtml("<a class=\"button\" href=\"" + view + "?_result=" + objectId + "&_" + VERSION + "=" + version + "&_" + METHOD + "=" + action.getId());
+ if (cancelTo != null) {
+ request.appendHtml("&_cancel-to=");
+ request.appendAsHtmlEncoded("cancel-to=\"" + cancelTo + "\"");
+ }
+ request.appendHtml("\" title=\"" + action.getDescription() + "\">");
+ request.appendAsHtmlEncoded(action.getName() + "...");
+ request.appendHtml("</a>");
+ }
+ }
+ request.appendHtml("</div>");
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "methods";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Parameter.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Parameter.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Parameter.java
new file mode 100644
index 0000000..69be5c5
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Parameter.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.action;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
+import org.apache.isis.viewer.scimpi.dispatcher.TagOrderException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Parameter extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final BlockContent blockContent = request.getBlockContent();
+ if (!(blockContent instanceof ActionContent)) {
+ throw new TagOrderException(request);
+ }
+
+ final String field = request.getOptionalProperty(PARAMETER_NUMBER);
+ final String value = request.getRequiredProperty(VALUE);
+ final ActionContent block = (ActionContent) blockContent;
+ block.setParameter(field, value);
+ }
+
+ @Override
+ public String getName() {
+ return "parameter";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/RunAction.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/RunAction.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/RunAction.java
new file mode 100644
index 0000000..9610457
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/RunAction.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.action;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+public class RunAction extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ public void process(final Request request) {
+ final RequestContext context = request.getContext();
+
+ final String objectId = request.getOptionalProperty(OBJECT);
+ final ObjectAdapter object = MethodsUtils.findObject(context, objectId);
+
+ final String methodName = request.getRequiredProperty(METHOD);
+ final ObjectAction action = MethodsUtils.findAction(object, methodName);
+
+ final String variableName = request.getOptionalProperty(RESULT_NAME);
+ final String scopeName = request.getOptionalProperty(SCOPE);
+
+ final ActionContent parameterBlock = new ActionContent(action);
+ request.setBlockContent(parameterBlock);
+ request.processUtilCloseTag();
+ final ObjectAdapter[] parameters = parameterBlock.getParameters(request);
+
+ if (!MethodsUtils.isVisibleAndUsable(object, action, where)) {
+ throw new ForbiddenException(action, ForbiddenException.VISIBLE_AND_USABLE);
+ }
+
+ // swap null parameter of the object's type to run a contributed method
+ if (false /*action.isContributed()*/) {
+ final List<ObjectActionParameter> parameterSpecs = action.getParameters();
+ for (int i = 0; i < parameters.length; i++) {
+ if (parameters[i] == null && object.getSpecification().isOfType(parameterSpecs.get(i).getSpecification())) {
+ parameters[i] = object;
+ break;
+ }
+ }
+ }
+
+ final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
+ MethodsUtils.runMethod(context, action, object, parameters, variableName, scope);
+ request.popBlockContent();
+ }
+
+ @Override
+ public String getName() {
+ return "run-action";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Services.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Services.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Services.java
new file mode 100644
index 0000000..2a621f1
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Services.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.action;
+
+import java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.InclusionList;
+
+public class Services extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final boolean showForms = request.isRequested(FORMS, false);
+ final String view = request.getOptionalProperty(VIEW, "_generic_action." + Dispatcher.EXTENSION);
+ final String cancelTo = request.getOptionalProperty(CANCEL_TO);
+
+ final InclusionList inclusionList = new InclusionList();
+ request.setBlockContent(inclusionList);
+ request.processUtilCloseTag();
+
+ final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
+ for (final ObjectAdapter adapter : serviceAdapters) {
+ final String serviceId = request.getContext().mapObject(adapter, Scope.REQUEST);
+ request.appendHtml("<div class=\"actions\">");
+ request.appendHtml("<h3>");
+ request.appendAsHtmlEncoded(adapter.titleString());
+ request.appendHtml("</h3>");
+ Methods.writeMethods(request, serviceId, adapter, showForms, inclusionList, view, cancelTo);
+ request.appendHtml("</div>");
+ }
+ request.popBlockContent();
+ }
+
+ @Override
+ public String getName() {
+ return "services";
+ }
+
+ private static PersistenceSession getPersistenceSession() {
+ return IsisContext.getPersistenceSession();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
new file mode 100644
index 0000000..1002c9f
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.collection;
+
+import java.util.Iterator;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
+
+public class Collection extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final RequestContext context = request.getContext();
+
+ ObjectAdapter collection;
+
+ final String field = request.getOptionalProperty(FIELD);
+ if (field != null) {
+ final String id = request.getOptionalProperty(OBJECT);
+ final ObjectAdapter object = context.getMappedObjectOrResult(id);
+ final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
+ if (!objectField.isOneToManyAssociation()) {
+ throw new ScimpiException("Field " + objectField.getId() + " is not a collection");
+ }
+ ResolveFieldUtil.resolveField(object, objectField);
+ collection = objectField.get(object);
+ } else {
+ final String id = request.getOptionalProperty(COLLECTION);
+ collection = context.getMappedObjectOrResult(id);
+ }
+
+ final RepeatMarker marker = request.createMarker();
+
+ final String variable = request.getOptionalProperty(ELEMENT_NAME);
+ final String scopeName = request.getOptionalProperty(SCOPE);
+ final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
+ final String rowClassesList = request.getOptionalProperty(ROW_CLASSES, ODD_ROW_CLASS + "|" + EVEN_ROW_CLASS);
+ String[] rowClasses = new String[0];
+ if (rowClassesList != null) {
+ rowClasses = rowClassesList.split("[,|/]");
+ }
+
+ final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
+ if (facet.size(collection) == 0) {
+ request.skipUntilClose();
+ } else {
+ final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
+ int row = 0;
+ while (iterator.hasNext()) {
+ final ObjectAdapter element = iterator.next();
+ context.addVariable("row", "" + (row + 1), Scope.REQUEST);
+ if (rowClassesList != null) {
+ context.addVariable("row-class", rowClasses[row % rowClasses.length], Scope.REQUEST);
+ }
+ context.addVariable(variable, context.mapObject(element, scope), scope);
+ marker.repeat();
+ request.processUtilCloseTag();
+ row++;
+ }
+ }
+ }
+
+ @Override
+ public String getName() {
+ return COLLECTION;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
new file mode 100644
index 0000000..c1a01b4
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
@@ -0,0 +1,479 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.commons.debug.DebugHtmlString;
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.commons.debug.DebuggableWithTitle;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+import org.apache.isis.core.metamodel.util.Dump;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Debug extends AbstractElementProcessor {
+
+ private final Dispatcher dispatcher;
+
+ public Debug(final Dispatcher dispatcher) {
+ this.dispatcher = dispatcher;
+ }
+
+ @Override
+ public void process(final Request request) {
+ if (request.getContext().isDebugDisabled()) {
+ return;
+ }
+
+ final String type = request.getOptionalProperty(TYPE);
+
+ final boolean alwaysShow = request.isRequested("force", false);
+ if (type != null) {
+ if (type.equals("system")) {
+ displaySystem(request);
+ } else if (type.equals("session")) {
+ displaySession(request);
+ } else if (type.equals("test")) {
+ final DebugBuilder debug = new DebugHtmlString();
+ debug.appendTitle("Title");
+ debug.appendln("boolean", true);
+ debug.appendln("number", 213);
+ debug.startSection("Section 1");
+ debug.appendln("boolean", false);
+ debug.appendln("number", 12348);
+ debug.endSection();
+ debug.startSection("Section 2");
+ debug.appendln("boolean", false);
+ debug.appendln("number", 12348);
+ debug.appendTitle("Another title");
+ debug.appendln("boolean", false);
+ debug.appendln("number", 12348);
+ debug.endSection();
+
+ debug.startSection("Section 3");
+ debug.appendln("boolean", false);
+ debug.appendln("number", 89878);
+ debug.endSection();
+ debug.startSection("Subsection 2");
+ debug.appendln("boolean", false);
+ debug.appendln("number", 12348);
+ debug.endSection();
+
+ debug.startSection("Section 4");
+ debug.appendln("boolean", false);
+ debug.indent();
+ debug.appendln("boolean", false);
+ debug.appendln("number", 12348);
+ debug.unindent();
+ debug.appendln("number", 12348);
+ debug.appendPreformatted("code", "line 1\nline 2\nline 3");
+ debug.appendln("A lot of text etc.");
+ debug.endSection();
+
+ request.appendHtml(debug.toString());
+ //request.appendHtml("<pre>" + debug.toString() + "</pre>");
+
+ debug.close();
+
+ } else if (type.equals("variables")) {
+ displayVariables(request);
+ } else if (type.equals("dispatcher")) {
+ displayDispatcher(request);
+ } else if (type.equals("context")) {
+ displayContext(request);
+ } else if (type.equals("specifications")) {
+ listSpecifications(request);
+ } else if (type.equals("specification-for")) {
+ specificationFor(request);
+ } else if (type.equals("specification")) {
+ specification(request);
+ } else if (type.equals("specification-graph")) {
+ specificationGraph(request);
+ } else if (type.equals("object-graph")) {
+ objectGraph(request);
+
+ } else if (type.equals("object")) {
+ final String value = request.getOptionalProperty(VALUE);
+ final RequestContext context = request.getContext();
+ final ObjectAdapter object = context.getMappedObject(value);
+ final DebugString str = new DebugString();
+ Dump.adapter(object, str);
+ Dump.graph(object, IsisContext.getAuthenticationSession(), str);
+ request.appendHtml("<h2>" + object.getSpecification().getFullIdentifier() + "</h2>");
+ request.appendHtml("<pre class=\"debug\">" + str + "</pre>");
+ }
+
+ }
+
+ if (alwaysShow || request.getContext().getDebug() == RequestContext.Debug.ON) {
+
+ final RequestContext context = request.getContext();
+
+ final String id = request.getOptionalProperty("object");
+ if (id != null) {
+ final ObjectAdapter object = context.getMappedObject(id);
+ if (object instanceof DebuggableWithTitle) {
+ final DebugString debug = new DebugString();
+ ((DebuggableWithTitle) object).debugData(debug);
+ request.appendHtml("<pre class=\"debug\">" + debug + "</pre>");
+ } else {
+ request.appendHtml(object.toString());
+ }
+ }
+
+ final String variable = request.getOptionalProperty("variable");
+ if (variable != null) {
+ final Object object = context.getVariable(variable);
+ request.appendHtml(variable + " => " + (object == null ? "null" : object.toString()));
+ }
+
+ final String list = request.getOptionalProperty("list");
+ if (list != null) {
+ final DebugString debug = new DebugString();
+ context.append(debug, list);
+ request.appendHtml(debug.toString());
+ }
+
+ final String uri = request.getOptionalProperty("uri");
+ if (uri != null) {
+ request.appendHtml("<pre class=\"debug\">");
+ request.appendHtml(context.getUri());
+ request.appendHtml("</pre>");
+ }
+
+ }
+ }
+
+ protected void objectGraph(final Request request) {
+ final String id = request.getOptionalProperty(VALUE);
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+ request.appendHtml("<h1>Object Graph - " + object + "</h1>");
+ request.appendHtml("<pre>");
+ final DebugBuilder debug = new DebugString();
+ Dump.graph(object, null, debug);
+ request.appendHtml(debug.toString());
+ request.appendHtml("</pre>");
+ }
+
+ protected void specificationFor(final Request request) {
+ final String id = request.getOptionalProperty(VALUE);
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+ specification(request, object.getSpecification());
+ }
+
+ protected void specification(final Request request) {
+ final String name = request.getOptionalProperty(VALUE);
+ final ObjectSpecification spec = getSpecificationLoader().loadSpecification(name);
+ specification(request, spec);
+ }
+
+ private void specification(final Request request, final ObjectSpecification spec) {
+ request.appendHtml("<h1>Specification - " + spec.getFullIdentifier() + "</h1>");
+ request.appendHtml("<p><a href=\"./debug.shtml?type=specification-graph&value=" + spec.getFullIdentifier() + "\">Specification Graph</a></p>");
+ final DebugBuilder debug = new DebugHtmlString();
+ specification(spec, debug);
+ request.appendHtml(debug.toString());
+ }
+
+ protected void specificationGraph(final Request request) {
+ final String name = request.getOptionalProperty(VALUE);
+ final ObjectSpecification spec = getSpecificationLoader().loadSpecification(name);
+ request.appendHtml("<h1>Specification Graph - " + spec.getFullIdentifier() + "</h1>");
+ request.appendHtml("<p><a href=\"./debug.shtml?type=specification&value=" + spec.getFullIdentifier() + "\">Full Specification</a></p>");
+ request.appendHtml("<pre>");
+ final DebugBuilder debug = new DebugString();
+ debug.appendln(spec.getFullIdentifier());
+ debug.indent();
+ specificationGraph(spec, debug, new ArrayList<ObjectSpecification>());
+ debug.unindent();
+ request.appendHtml(debug.toString());
+ request.appendHtml("</pre>");
+ }
+
+ private void displayContext(final Request request) {
+ request.appendHtml("<h1>Context</h1>");
+ final DebugHtmlString debugString = new DebugHtmlString();
+ request.getContext().append(debugString);
+ debugString.close();
+ request.appendHtml(debugString.toString());
+ }
+
+ private void displayDispatcher(final Request request) {
+ request.appendHtml("<h1>Dispatcher</h1>");
+ final DebugHtmlString debugString = new DebugHtmlString();
+ dispatcher.debug(debugString);
+ debugString.close();
+ request.appendHtml(debugString.toString());
+ }
+
+ protected void displayVariables(final Request request) {
+ request.appendHtml("<h1>Variables</h1>");
+ final DebugHtmlString debug = new DebugHtmlString();
+ final RequestContext context = request.getContext();
+ context.append(debug, "variables");
+ debug.close();
+ request.appendHtml(debug.toString());
+ }
+
+ protected void displaySystem(final Request request) {
+ request.appendHtml("<h1>System</h1>");
+ final DebuggableWithTitle[] debugItems = IsisContext.debugSystem();
+ for (final DebuggableWithTitle debug : debugItems) {
+ final DebugHtmlString debugBuffer = new DebugHtmlString();
+ debugBuffer.startSection(debug.debugTitle());
+ debug.debugData(debugBuffer);
+ debugBuffer.endSection();
+ debugBuffer.close();
+ request.appendHtml(debugBuffer.toString());
+ }
+ }
+
+ protected void displaySession(final Request request) {
+ request.appendHtml("<h1>Session</h1>");
+ final DebuggableWithTitle[] debugItems = IsisContext.debugSession();
+ for (final DebuggableWithTitle debug : debugItems) {
+ final DebugHtmlString debugBuffer = new DebugHtmlString();
+ debugBuffer.startSection(debug.debugTitle());
+ debug.debugData(debugBuffer);
+ debugBuffer.endSection();
+ debugBuffer.close();
+ request.appendHtml(debugBuffer.toString());
+ }
+ }
+
+ protected void listSpecifications(final Request request) {
+ request.appendHtml("<h1>Specifications</h1>");
+ final List<ObjectSpecification> fullIdentifierList = new ArrayList<ObjectSpecification>(getSpecificationLoader().allSpecifications());
+ Collections.sort(fullIdentifierList, ObjectSpecification.COMPARATOR_SHORT_IDENTIFIER_IGNORE_CASE);
+ final DebugHtmlString debug = new DebugHtmlString();
+ for (final ObjectSpecification spec : fullIdentifierList) {
+ final String name = spec.getSingularName();
+ debug.appendln(name, specificationLink(spec));
+ }
+ debug.close();
+ request.appendHtml(debug.toString());
+ }
+
+ private String specificationLink(final ObjectSpecification specification) {
+ if (specification == null) {
+ return "none";
+ } else {
+ final String name = specification.getFullIdentifier();
+ return "<a href=\"./debug.shtml?type=specification&value=" + name + "\">" + name + "</a>";
+ }
+ }
+
+ protected SpecificationLoaderSpi getSpecificationLoader() {
+ return IsisContext.getSpecificationLoader();
+ }
+
+ @Override
+ public String getName() {
+ return "debug";
+ }
+
+ private void specificationGraph(final ObjectSpecification spec, final DebugBuilder view, final ArrayList<ObjectSpecification> visited) {
+ final List<ObjectAssociation> fields = new ArrayList<ObjectAssociation>(spec.getAssociations(Contributed.EXCLUDED));
+ Collections.sort(fields, new Comparator<ObjectAssociation>() {
+ @Override
+ public int compare(final ObjectAssociation o1, final ObjectAssociation o2) {
+ return o1.getName().compareTo(o2.getName());
+ }
+ });
+ for (int i = 0; i < fields.size(); i++) {
+ final ObjectAssociation field = fields.get(i);
+ final ObjectSpecification specification = field.getSpecification();
+ if (!specification.isValue()) {
+ final boolean contains = visited.contains(specification);
+ final String aggregated = specification.isParented() ? "++" : "";
+ view.appendln(aggregated + field.getName() + " (<a href=\"./debug.shtml?type=specification-graph&value=" + specification.getFullIdentifier() + "\">" + specification.getFullIdentifier() + "</a>" + (contains ? "..." : "") + ")");
+ if (!contains) {
+ visited.add(specification);
+ view.indent();
+ specificationGraph(specification, view, visited);
+ view.unindent();
+ }
+ }
+ }
+
+ }
+
+ private void specification(final ObjectSpecification spec, final DebugBuilder view) {
+ view.startSection("Summary");
+ view.appendln("Hash code", "#" + Integer.toHexString(spec.hashCode()));
+ view.appendln("ID", spec.getIdentifier());
+ view.appendln("Full name", spec.getFullIdentifier());
+ view.appendln("Short name", spec.getShortIdentifier());
+ view.appendln("Singular name", spec.getSingularName());
+ view.appendln("Plural name", spec.getPluralName());
+ view.appendln("Description", spec.getDescription());
+
+ view.appendln("Type", "?");
+ view.appendln("Value/aggregated", String.valueOf(!spec.isValueOrIsParented()));
+
+ view.appendln("Parent specification", specificationLink(spec.superclass()));
+ specificationClasses(view, "Child specifications", spec.subclasses());
+ specificationClasses(view, "Implemented interfaces", spec.interfaces());
+ speficationFacets(view, spec);
+
+ final List<ObjectAssociation> fields = spec.getAssociations(Contributed.EXCLUDED);
+ specificationMembers(view, "Fields", fields);
+ final List<ObjectAction> userActions = spec.getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
+ specificationMembers(view, "User Actions", userActions);
+ specificationMembers(view, "Exploration Actions", spec.getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED, Filters.<ObjectAction>any()));
+ specificationMembers(view, "Prototype Actions", spec.getObjectActions(ActionType.PROTOTYPE, Contributed.INCLUDED, Filters.<ObjectAction>any()));
+ specificationMembers(view, "Debug Actions", spec.getObjectActions(ActionType.DEBUG, Contributed.INCLUDED, Filters.<ObjectAction>any()));
+ view.endSection();
+
+ view.startSection("Fields");
+ for (int i = 0; i < fields.size(); i++) {
+ final ObjectAssociation field = fields.get(i);
+ view.appendTitle("<span id=\"" + field.getId() + "\"><em>Field:</em> " + field.getId() + "</span>");
+ view.appendln("ID", field.getIdentifier());
+ view.appendln("Short ID", field.getId());
+ view.appendln("Name", field.getName());
+ view.appendln("Specification", specificationLink(field.getSpecification()));
+
+ view.appendln("Type", field.isOneToManyAssociation() ? "Collection" : field.isOneToOneAssociation() ? "Object" : "Unknown");
+ view.appendln("Flags", (field.isAlwaysHidden() ? "" : "Visible ") + (field.isNotPersisted() ? "Not-Persisted " : " ") + (field.isMandatory() ? "Mandatory " : ""));
+
+ speficationFacets(view, field);
+ }
+ view.endSection();
+
+ view.startSection("Actions");
+ for (int i = 0; i < userActions.size(); i++) {
+ final ObjectAction action = userActions.get(i);
+ view.appendTitle("<span id=\"" + action.getId() + "\"><em>Action:</em> " + action.getId() + "</span>");
+ view.appendln("ID", action.getIdentifier());
+ view.appendln("Short ID", action.getId());
+ view.appendln("Name", action.getName());
+ view.appendln("Specification", specificationLink(action.getSpecification()));
+
+ view.appendln("On type", specificationLink(action.getOnType()));
+
+ final ObjectSpecification returnType = action.getReturnType();
+ view.appendln("Returns", returnType == null ? "VOID" : specificationLink(returnType));
+
+ speficationFacets(view, action);
+
+ final List<ObjectActionParameter> parameters = action.getParameters();
+ if (parameters.size() == 0) {
+ view.appendln("Parameters", "none");
+ } else {
+ final StringBuffer buffer = new StringBuffer();
+ final List<ObjectActionParameter> p = action.getParameters();
+ for (int j = 0; j < parameters.size(); j++) {
+ buffer.append(p.get(j).getName());
+ buffer.append(" (");
+ buffer.append(specificationLink(parameters.get(j).getSpecification()));
+ buffer.append(")");
+ view.appendln("Parameters", buffer.toString());
+
+ view.indent();
+ final Class<? extends Facet>[] parameterFacets = p.get(j).getFacetTypes();
+ for (final Class<? extends Facet> parameterFacet : parameterFacets) {
+ view.append(p.get(j).getFacet(parameterFacet).toString());
+ }
+ view.unindent();
+ }
+ }
+ }
+ }
+
+ private void specificationClasses(final DebugBuilder view, final String label, final List<ObjectSpecification> subclasses) {
+ final StringBuffer buffer = new StringBuffer();
+ if (subclasses.size() == 0) {
+ buffer.append("none");
+ } else {
+ for (int i = 0; i < subclasses.size(); i++) {
+ buffer.append(specificationLink(subclasses.get(i)) + "<br>");
+ }
+ }
+ view.appendln(label, buffer.toString());
+ }
+
+ private void specificationMembers(final DebugBuilder view, final String label, final List<? extends ObjectMember> members) {
+ final StringBuffer buffer = new StringBuffer();
+ if (members.size() == 0) {
+ buffer.append("none");
+ } else {
+ for (int i = 0; i < members.size(); i++) {
+ final ObjectMember member = members.get(i);
+ buffer.append("<a href=\"#" + members.get(i).getId() + "\">" + member.getId() + "</a> <small>");
+ buffer.append(member.isAlwaysHidden() ? "" : "Visible ");
+ if (member.isPropertyOrCollection()) {
+ buffer.append(((ObjectAssociation) member).isNotPersisted() ? "Not-Persisted " : " ");
+ buffer.append(((ObjectAssociation) member).isMandatory() ? "Mandatory " : "");
+ }
+ buffer.append("</small></a><br>");
+ }
+ }
+ view.appendln(label, buffer.toString());
+ }
+
+ private void speficationFacets(final DebugBuilder view, final FacetHolder facetHolder) {
+ final List<Facet> facets = facetHolder.getFacets(new Filter<Facet>() {
+ @Override
+ public boolean accept(final Facet facet) {
+ return true;
+ }
+ });
+ final StringBuffer buffer = new StringBuffer();
+ if (facets == null || facets.size() == 0) {
+ buffer.append("none");
+ } else {
+ Collections.sort(facets, new Comparator<Facet>() {
+ @Override
+ public int compare(final Facet o1, final Facet o2) {
+ final String facetType1 = o1.facetType().getName();
+ final String facetType2 = o2.facetType().getName();
+ return facetType1.substring(facetType1.lastIndexOf('.') + 1).compareTo(facetType2.substring(facetType2.lastIndexOf('.') + 1));
+ }
+ });
+ for (final Facet facet : facets) {
+ final String facetType = facet.facetType().getName();
+ buffer.append("<span class=\"facet-type\">" + facetType.substring(facetType.lastIndexOf('.') + 1) + "</span>: " + facet + "<br>");
+ }
+ }
+ view.appendln("Facets", buffer.toString());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugAccessCheck.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugAccessCheck.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugAccessCheck.java
new file mode 100644
index 0000000..796faf0
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugAccessCheck.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class DebugAccessCheck extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ if (request.getContext().isDebugDisabled()) {
+ throw new ForbiddenException("Debug is disabled");
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "debug-access-check";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugCollectionView.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugCollectionView.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugCollectionView.java
new file mode 100644
index 0000000..9137783
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugCollectionView.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
+
+import java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
+import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
+
+public class DebugCollectionView extends AbstractObjectProcessor {
+
+ @Override
+ public void process(final Request request, final ObjectAdapter object) {
+ final String cls = request.getOptionalProperty(CLASS, "form");
+ final String classString = " class=\"" + cls + "\"";
+ String title = request.getOptionalProperty(FORM_TITLE);
+ final String oddRowClass = request.getOptionalProperty(ODD_ROW_CLASS);
+ final String evenRowClass = request.getOptionalProperty(EVEN_ROW_CLASS);
+ final boolean showIcons = request.isRequested(SHOW_ICON, true);
+
+ }
+
+ private void write(final Request request, final ObjectAdapter object, final List<ObjectAssociation> fields,
+ final LinkedObject[] linkFields, final String classString, final String title, final String oddRowClass,
+ final String evenRowClass, final boolean showIcons) {
+ request.appendHtml("<div" + classString + ">");
+ if (title != null) {
+ request.appendHtml("<div class=\"title\">");
+ request.appendAsHtmlEncoded(title);
+ request.appendHtml("</div>");
+ HelpLink.append(request, object.getSpecification().getDescription(), object.getSpecification().getHelp());
+ }
+ /*
+ final List<ObjectAssociation> fields =
+ tag.includedFields(object.getSpecification().getAssociations(
+ ObjectAssociationFilters.STATICALLY_VISIBLE_ASSOCIATIONS));
+ final LinkedObject[] linkFields = tag.linkedFields(fields);
+
+ String linkAllView = request.getOptionalProperty(LINK);
+ if (linkAllView != null) {
+ linkAllView = request.getContext().fullUriPath(linkAllView);
+ for (int i = 0; i < linkFields.length; i++) {
+ final boolean isObject = fields.get(i).isOneToOneAssociation();
+ final boolean isNotParseable =
+ !fields.get(i).getSpecification().containsFacet(ParseableFacet.class);
+ linkFields[i] = isObject && isNotParseable ? new LinkedObject(linkAllView) : null;
+ }
+ }
+
+
+
+ int row = 1;
+ for (int i = 0; i < fields.size(); i++) {
+ final ObjectAssociation field = fields.get(i);
+ if (ignoreField(field)) {
+ continue;
+ }
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) {
+ continue;
+ }
+
+ final String description =
+ field.getDescription().equals("") ? "" : "title=\"" + field.getDescription() + "\"";
+ String cls;
+ if (row++ % 2 == 1) {
+ cls = " class=\"field " + (oddRowClass == null ? ODD_ROW_CLASS : oddRowClass) + "\"";
+ } else {
+ cls = " class=\"field " + (evenRowClass == null ? EVEN_ROW_CLASS : evenRowClass) + "\"";
+ }
+ request.appendHtml("<div " + cls + description + "><span class=\"label\">");
+ request.appendAsHtmlEncoded(field.getName());
+ request.appendHtml(":</span>");
+ final LinkedObject linkedObject = linkFields[i];
+ addField(request, object, field, linkedObject, showIcons);
+ HelpLink.append(request, field.getDescription(), field.getHelp());
+ request.appendHtml("</div>");
+ }
+ */
+ request.appendHtml("</div>");
+
+ }
+
+
+ @Override
+ public String getName() {
+ return "debug-collection";
+ }
+
+}
[59/59] [abbrv] isis git commit: ISIS-789: tiny improvement in
simpleapp's pom.xml, to parameterize version of DN mvn plugin.
Posted by da...@apache.org.
ISIS-789: tiny improvement in simpleapp's pom.xml, to parameterize version of DN mvn plugin.
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/e17c6857
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/e17c6857
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/e17c6857
Branch: refs/heads/ISIS-789
Commit: e17c6857a439a307b296a41b096b75495626e8ea
Parents: 9679840
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Mar 30 16:36:51 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Mar 30 16:40:40 2015 +0100
----------------------------------------------------------------------
example/application/simpleapp/dom/pom.xml | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/e17c6857/example/application/simpleapp/dom/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/pom.xml b/example/application/simpleapp/dom/pom.xml
index 40a1c10..0d258b0 100644
--- a/example/application/simpleapp/dom/pom.xml
+++ b/example/application/simpleapp/dom/pom.xml
@@ -85,9 +85,7 @@
<artifactId>
datanucleus-maven-plugin
</artifactId>
- <versionRange>
- [4.0.0-release,)
- </versionRange>
+ <versionRange>[${datanucleus-maven-plugin.version},)</versionRange>
<goals>
<goal>enhance</goal>
</goals>
[39/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
new file mode 100644
index 0000000..d60a45f
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
@@ -0,0 +1,124 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+
+
+#################################################################################
+#
+# Persistor
+#
+#################################################################################
+
+
+
+# generally speaking this should not be enabled
+isis.persistor.disableConcurrencyChecking=false
+
+
+
+
+#################################################################################
+#
+# JDBC configuration
+#
+#################################################################################
+
+#
+# configuration file holding the JDO objectstore's JDBC configuration
+# (this is a bit of a hack... just exploiting fact that Isis also loads this file)
+#
+
+
+#
+# JDBC connection details
+# (also update the pom.xml to reference the appropriate JDBC driver)
+#
+
+#
+# neo4j
+#
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=neo4j:testDB
+
+#
+# HSQLDB in-memory
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:hsqldb:mem:test
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
+
+#
+# HSQLDB in-memory (using log4jdbc-remix)
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:hsqldb:mem:test
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
+
+
+
+#
+# HSQLDB to file
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:hsqldb:file:/tmp/isis-simple-app/hsql-db;hsqldb.write_delay=false;shutdown=true
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
+
+#
+# HSQLDB to file (using log4jdbc-remix)
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:hsqldb:file:/tmp/isis-simple-app/hsql-db;hsqldb.write_delay=false;shutdown=true
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
+
+
+
+#
+# PostgreSQL Server
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.postgresql.Driver
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:postgresql://localhost:5432/isis
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=isis
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=isis
+
+#
+# PostgreSQL Server (using log4jdbc-remix)
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:postgresql://localhost:5432/isis
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=isis
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=isis
+
+
+
+#
+# MS SQL Server
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=com.microsoft.sqlserver.jdbc.SQLServerDriver
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:sqlserver://127.0.0.1:1433;instance=.;databaseName=simple
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=p4ssword
+
+#
+# MS SQL Server (using log4jdbc-remix)
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:sqlserver://127.0.0.1:1433;instance=SQLEXPRESS;databaseName=jdo
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=jdo
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=jdopass
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
new file mode 100644
index 0000000..2f41400
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
@@ -0,0 +1,104 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+#
+# configuration file for the JDO/DataNucleus objectstore
+#
+
+# identifies @PersistenceCapable entities to be eagerly registered
+# if move class to other package (eg com.mycompany.myapp.dom) then update
+isis.persistor.datanucleus.RegisterEntities.packagePrefix=dom
+
+# whether to persist the event data as a "clob" or as a "zipped" byte[]
+# default is "zipped"
+#isis.persistor.datanucleus.PublishingService.serializedForm=zipped
+
+
+#####################################################################
+#
+# DataNucleus' configuration
+#
+# The 'isis.persistor.datanucleus.impl' prefix is stripped off,
+# remainder is passed through to DataNucleus
+#
+#####################################################################
+
+isis.persistor.datanucleus.impl.datanucleus.autoCreateSchema=true
+isis.persistor.datanucleus.impl.datanucleus.validateTables=true
+isis.persistor.datanucleus.impl.datanucleus.validateConstraints=true
+
+
+#
+# Require explicit persistence (since entities are Comparable and using ObjectContracts#compareTo).
+# see http://www.datanucleus.org/products/accessplatform_3_0/jdo/transaction_types.html
+#
+isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false
+
+
+#
+# How column names are identified
+# (http://www.datanucleus.org/products/datanucleus/jdo/orm/datastore_identifiers.html)
+#
+isis.persistor.datanucleus.impl.datanucleus.identifier.case=PreserveCase
+
+isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateTables=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateConstraints=true
+
+
+#
+# Require explicit persistence (since entities are Comparable and using ObjectContracts#compareTo).
+# see http://www.datanucleus.org/products/accessplatform_3_0/jdo/transaction_types.html
+#
+isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false
+
+
+#
+# How column names are identified
+# (http://www.datanucleus.org/products/datanucleus/jdo/orm/datastore_identifiers.html)
+#
+isis.persistor.datanucleus.impl.datanucleus.identifier.case=MixedCase
+
+#
+# L2 cache
+# off except if explicitly marked as cacheable
+# http://www.datanucleus.org/products/datanucleus/jdo/cache.html
+#
+isis.persistor.datanucleus.impl.datanucleus.cache.level2.type=none
+isis.persistor.datanucleus.impl.datanucleus.cache.level2.mode=ENABLE_SELECTIVE
+
+
+
+#
+# uncomment to use JNDI rather than direct JDBC
+#
+#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactoryName=java:comp/env/jdbc/quickstart
+
+#
+# uncomment to use JTA resource
+#
+#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactory2Name=java:comp/env/jdbc/quickstart-nontx
+#isis.persistor.datanucleus.impl.javax.jdo.option.TransactionType=JTA
+
+
+
+#
+#
+# JDBC connection details
+# ... are in persistor.properties
+#
+#
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini
new file mode 100644
index 0000000..a643d86
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini
@@ -0,0 +1,93 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+[main]
+
+contextFactory = org.apache.isis.security.shiro.IsisLdapContextFactory
+contextFactory.url = ldap://localhost:10389
+contextFactory.authenticationMechanism = CRAM-MD5
+contextFactory.systemAuthenticationMechanism = simple
+contextFactory.systemUsername = uid=admin,ou=system
+contextFactory.systemPassword = secret
+
+ldapRealm = org.apache.isis.security.shiro.IsisLdapRealm
+ldapRealm.contextFactory = $contextFactory
+
+ldapRealm.searchBase = ou=groups,o=mojo
+ldapRealm.groupObjectClass = groupOfUniqueNames
+ldapRealm.uniqueMemberAttribute = uniqueMember
+ldapRealm.uniqueMemberAttributeValueTemplate = uid={0}
+
+# optional mapping from physical groups to logical application roles
+#ldapRealm.rolesByGroup = \
+# LDN_USERS: user_role,\
+# NYK_USERS: user_role,\
+# HKG_USERS: user_role,\
+# GLOBAL_ADMIN: admin_role,\
+# DEMOS: self-install_role
+
+ldapRealm.permissionsByRole=\
+ user_role = *:ToDoItemsJdo:*:*,\
+ *:ToDoItem:*:*; \
+ self-install_role = *:ToDoItemsFixturesService:install:* ; \
+ admin_role = *
+
+# to use ldap...
+# (see docs for details of how to setup users/groups in Apache Directory Studio).
+#securityManager.realms = $ldapRealm
+
+# to use .ini file
+securityManager.realms = $iniRealm
+
+
+
+# -----------------------------------------------------------------------------
+# Users and their assigned roles
+#
+# Each line conforms to the format defined in the
+# org.apache.shiro.realm.text.TextConfigurationRealm#setUserDefinitions JavaDoc
+# -----------------------------------------------------------------------------
+
+[users]
+# user = password, role1, role2, role3, ...
+
+
+sven = pass, admin_role
+dick = pass, user_role, self-install_role
+bob = pass, user_role, self-install_role
+joe = pass, user_role, self-install_role
+guest = guest, user_role
+
+
+
+# -----------------------------------------------------------------------------
+# Roles with assigned permissions
+#
+# Each line conforms to the format defined in the
+# org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions JavaDoc
+# -----------------------------------------------------------------------------
+
+[roles]
+# role = perm1, perm2, perm3, ...
+# perm in format: packageName:className:memberName:r,w
+
+user_role = *:ToDoItemsJdo:*:*,\
+ *:ToDoItem:*:*
+self-install_role = *:ToDoItemsFixturesService:install:*
+admin_role = *
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
new file mode 100644
index 0000000..0a85fb6
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
@@ -0,0 +1,66 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+#
+# configuration file for the Restful Objects viewer
+#
+
+# the baseUrl for hrefs in the events generated by the RO EventSerializer
+isis.viewer.restfulobjects.RestfulObjectsSpecEventSerializer.baseUrl=http://localhost:8080/restful/
+
+# renders param details in the (incorrect) form that they were for GSOC2013 viewers
+# isis.viewer.restfulobjects.gsoc2013.legacyParamDetails=true
+
+# whether to honor UI hints, in particular Render(EAGERLY). Defaults to false.
+#isis.viewer.restfulobjects.honorUiHints=false
+
+
+
+###############################################################################
+# Non-standard configuration settings.
+#
+# If enabled of the following are enabled then the viewer is deviating from the
+# RO spec standard; compatibility may be compromised with RO clients.
+###############################################################################
+
+# whether to show only object properties for object members
+# (on the object representation only)
+# Takes precedence over the other 'suppress' below.
+#isis.viewer.restfulobjects.objectPropertyValuesOnly=true
+
+# whether to suppress "describedby" links. Defaults to false.
+#isis.viewer.restfulobjects.suppressDescribedByLinks=true
+
+# whether to suppress "update" links. Defaults to false.
+#isis.viewer.restfulobjects.suppressUpdateLink=true
+
+# whether to suppress "id" json-prop for object members. Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberId=true
+
+# whether to suppress "links" json-prop for object members
+# (on the object representation only). Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberLinks=true
+
+# whether to suppress "extensions" json-prop for object members
+# (on the object representation only). Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberExtensions=true
+
+# whether to suppress "disabledReason" json-prop for object members
+# (on the object representation only). Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberDisabledReason=true
+
+###############################################################################
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties
new file mode 100644
index 0000000..79ddf66
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties
@@ -0,0 +1,84 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+#
+# configuration file for the Wicket viewer
+#
+
+#
+# The maximum length of titles to display in standalone or parented tables.
+# Titles longer than this length will be truncated with trailing ellipses (...)
+#
+# For example, if set to 12, the title
+# "Buy milk on 15-Feb-13" will be truncated to "Buy milk ..."
+#
+# If set to 0, then only the icon will be shown.
+#
+isis.viewer.wicket.maxTitleLengthInStandaloneTables=0
+isis.viewer.wicket.maxTitleLengthInParentedTables=0
+
+
+#isis.viewer.wicket.datePattern=dd-MM-yyyy
+#isis.viewer.wicket.dateTimePattern=dd-MM-yyyy HH:mm
+#isis.viewer.wicket.datePickerPattern=DD-MM-YYYY
+
+#isis.viewer.wicket.datePattern=dd/MM/yy
+#isis.viewer.wicket.dateTimePattern=dd/MM/yy HH:mm
+#isis.viewer.wicket.datePickerPattern=DD/MM/YY
+
+
+#
+# whether to strip wicket tags from markup (default is true, as they may break some CSS rules)
+#
+#isis.viewer.wicket.stripWicketTags=false
+
+
+#
+# whether to suppress the 'rememberMe' checkbox on the login page (default is false)
+#
+#isis.viewer.wicket.suppressRememberMe=false
+
+#
+# if user attempts to access a protected URL before signing in, then as a convenience the viewer will continue
+# through to that destination after successful login. If you consider this to be a security risk then this flag
+# disables that behaviour (default is false).
+#
+#isis.viewer.wicket.clearOriginalDestination=true
+
+
+#
+# whether to show action dialogs on their own page rather than as a modal dialog (default is false)
+#
+#isis.viewer.wicket.disableModalDialogs=false
+
+
+#
+# the maximum number of pages to list in bookmark (default is 15)
+#
+#isis.viewer.wicket.bookmarkedPages.maxSize=15
+
+
+#
+# whether to show the bootstrap theme chooser (defaults false)
+#
+#isis.viewer.wicket.themes.showChooser=false
+isis.viewer.wicket.themes.showChooser=true
+
+#
+# comma-separated list of themes to choose from (default is to show all themes from bootswatch.com).
+#
+#isis.viewer.wicket.themes.enabled=bootstrap-theme,Cosmo,Flatly,Darkly,Sandstone,United
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..b169b00
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<web-app id="WebApp_ID" version="2.4"
+ xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+ <display-name>Simple app</display-name>
+
+ <welcome-file-list>
+ <welcome-file>about/index.html</welcome-file>
+ </welcome-file-list>
+
+ <!-- shiro security configuration -->
+ <listener>
+ <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
+ </listener>
+
+ <filter>
+ <filter-name>ShiroFilter</filter-name>
+ <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>ShiroFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+
+
+ <!-- which configuration directory to read overloaded property files from -->
+ <!--
+ Normally configuration like this should be done from outside your web
+ application. Especially if your configuration is not know in advance or
+ if it can change depending on where the application gets deployed.
+
+ For instance to configure this in Tomcat outside the application WAR add
+ the following line to your application context ( For more detail see:
+ http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Context_Parameters )
+
+ <Parameter name="isis.config.dir" value="/usr/local/tomcat/conf/"
+ override="true"/>
+
+ If your configuration directory is fixed you can enable the following
+ context parameter in here and forget about the outside part.
+
+ <context-param>
+ <param-name>isis.config.dir</param-name>
+ <param-value>location of your config directory if fixed</param-value>
+ </context-param>
+ -->
+
+
+ <!--
+ determines which additional configuration files to search for
+ -->
+ <context-param>
+ <param-name>isis.viewers</param-name>
+ <param-value>wicket,restfulobjects</param-value>
+ </context-param>
+
+
+
+ <!--
+ for diagnostics
+ -->
+ <filter>
+ <filter-name>IsisLogOnExceptionFilter</filter-name>
+ <filter-class>org.apache.isis.core.webapp.diagnostics.IsisLogOnExceptionFilter</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>IsisLogOnExceptionFilter</filter-name>
+ <url-pattern>/wicket/*</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>IsisLogOnExceptionFilter</filter-name>
+ <url-pattern>/restful/*</url-pattern>
+ </filter-mapping>
+
+
+
+ <!-- cache static resources for 1 day -->
+ <filter>
+ <filter-name>ResourceCachingFilter</filter-name>
+ <filter-class>org.apache.isis.core.webapp.content.ResourceCachingFilter</filter-class>
+ <init-param>
+ <param-name>CacheTime</param-name>
+ <param-value>86400</param-value>
+ </init-param>
+ </filter>
+ <filter-mapping>
+ <filter-name>ResourceCachingFilter</filter-name>
+ <url-pattern>*.js</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>ResourceCachingFilter</filter-name>
+ <url-pattern>*.css</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>ResourceCachingFilter</filter-name>
+ <url-pattern>*.png</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>ResourceCachingFilter</filter-name>
+ <url-pattern>*.jpg</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>ResourceCachingFilter</filter-name>
+ <url-pattern>*.gif</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>ResourceCachingFilter</filter-name>
+ <url-pattern>*.html</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>ResourceCachingFilter</filter-name>
+ <url-pattern>*.swf</url-pattern>
+ </filter-mapping>
+
+ <servlet>
+ <servlet-name>Resource</servlet-name>
+ <servlet-class>org.apache.isis.core.webapp.content.ResourceServlet</servlet-class>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Resource</servlet-name>
+ <url-pattern>*.css</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>Resource</servlet-name>
+ <url-pattern>*.png</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>Resource</servlet-name>
+ <url-pattern>*.jpg</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>Resource</servlet-name>
+ <url-pattern>*.gif</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>Resource</servlet-name>
+ <url-pattern>*.js</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>Resource</servlet-name>
+ <url-pattern>*.html</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>Resource</servlet-name>
+ <url-pattern>*.swf</url-pattern>
+ </servlet-mapping>
+
+
+
+ <!--
+ -
+ - config specific to the wicket-viewer
+ -
+ -->
+ <filter>
+ <filter-name>WicketFilter</filter-name>
+ <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
+ <init-param>
+ <param-name>applicationClassName</param-name>
+ <param-value>webapp.SimpleApplication</param-value>
+ </init-param>
+ </filter>
+ <filter-mapping>
+ <filter-name>WicketFilter</filter-name>
+ <url-pattern>/wicket/*</url-pattern>
+ </filter-mapping>
+
+
+ <context-param>
+ <param-name>configuration</param-name>
+ <!--
+ <param-value>deployment</param-value>
+ -->
+ <param-value>development</param-value>
+ </context-param>
+
+
+ <!--
+ -
+ - config specific to the restfulobjects-viewer
+ -
+ -->
+
+ <!--
+ THE FOLLOWING CONFIGURATION IS NOT REQUIRED IF THE WICKET VIEWER IS IN USE.
+ IF THE WICKET VIEWER CONFIGURATION IS REMOVED, THEN UNCOMMENT
+
+ <listener>
+ <listener-class>org.apache.isis.core.webapp.IsisWebAppBootstrapper</listener-class>
+ </listener>
+
+ <context-param>
+ <param-name>deploymentType</param-name>
+ <param-value>SERVER_EXPLORATION</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>isis.viewers</param-name>
+ <param-value>restfulobjects</param-value>
+ </context-param>
+ -->
+
+ <!-- bootstrap the RestEasy framework -->
+ <listener>
+ <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
+ </listener>
+
+ <!-- used by RestEasy to determine the JAX-RS resources and other related configuration -->
+ <context-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplication</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>resteasy.servlet.mapping.prefix</param-name>
+ <param-value>/restful/</param-value>
+ </context-param>
+
+
+ <!-- authenticate user, set up an Isis session -->
+ <filter>
+ <filter-name>IsisSessionFilterForRestfulObjects</filter-name>
+ <filter-class>org.apache.isis.core.webapp.IsisSessionFilter</filter-class>
+ <!-- authentication required for REST -->
+ <init-param>
+ <param-name>authenticationSessionStrategy</param-name>
+ <param-value>org.apache.isis.viewer.restfulobjects.server.authentication.AuthenticationSessionStrategyBasicAuth</param-value>
+ </init-param>
+ <init-param>
+ <!-- what to do if no session was found; we indicate to issue a 401 basic authentication challenge -->
+ <param-name>whenNoSession</param-name>
+ <param-value>basicAuthChallenge</param-value>
+ </init-param>
+ </filter>
+ <filter-mapping>
+ <!-- this is mapped to the entire app; however the IsisSessionFilter will "notice" if the session filter has already been
+ executed for the request pipeline, and if so will do nothing -->
+ <filter-name>IsisSessionFilterForRestfulObjects</filter-name>
+ <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
+ </filter-mapping>
+
+ <filter>
+ <filter-name>IsisTransactionFilterForRestfulObjects</filter-name>
+ <filter-class>org.apache.isis.viewer.restfulobjects.server.webapp.IsisTransactionFilterForRestfulObjects</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>IsisTransactionFilterForRestfulObjects</filter-name>
+ <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
+ </filter-mapping>
+
+
+ <servlet>
+ <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
+ <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
+ <url-pattern>/restful/*</url-pattern>
+ </servlet-mapping>
+
+
+ <!--
+ uncomment to use container-managed datasource;
+ for both container-managed (JTA) and non-container-managed transactions
+ -->
+ <!--
+ <resource-ref>
+ <description>db</description>
+ <res-ref-name>jdbc/quickstart</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+ </resource-ref>
+ -->
+
+ <!--
+ uncomment to use container-managed datasource
+ with container-managed transactions (JTA).
+ -->
+ <!--
+ <resource-ref>
+ <description>db</description>
+ <res-ref-name>jdbc/quickstart-nontx</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+ </resource-ref>
+ -->
+
+</web-app>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png b/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png
new file mode 100644
index 0000000..5284fe7
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/about/index.html
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/about/index.html b/example/application/neoapp/webapp/src/main/webapp/about/index.html
new file mode 100644
index 0000000..b623158
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/about/index.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>Apache Isis™ SimpleApp</title>
+
+ <style type="text/css">
+body {
+ background-color: #1A467B;
+ font-family: Verdana, Helvetica, Arial;
+ font-size: 90%;
+}
+
+li {
+ margin-top: 6px;
+ margin-bottom: 6px;
+}
+table {
+ border-collapse: collapse;
+}
+table, th, td {
+ border: 1px;
+ border-style: solid;
+ border-color: lightgray;
+}
+th, td {
+ padding: 10px;
+}
+#wrapper {
+ background-color: #ffffff;
+ width: 900px;
+ margin: 8px auto;
+ padding: 12px;
+}
+ </style>
+ </head>
+ <body>
+ <div id="wrapper">
+ <img alt="Isis Logo" src="about/images/isis-logo.png" />
+
+ <p>
+ <a href="http://isis.apache.org" target="_blank">Apache Isis</a>™ is a framework to let you rapidly develop
+ domain-driven apps in Java. This app has been generated using Isis'
+ <a href="http://isis.apache.org/intro/getting-started/simple%61pp-archetype.html" target="_blank">SimpleApp</a> archetype,
+ which configures Isis to run a very simple and purposefully minimal application.
+
+ <p>
+ The app itself consists of a single domain class,
+ <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObject.java" target="_blank"><tt>SimpleObject</tt></a>,
+ along with an equally simple (factory/repository) domain service, <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObjects.java" target="_blank"><tt>SimpleObjects</tt></a>.
+ </p>
+
+ <p>To access the app:</p>
+ <ul>
+ <li>
+ <p>
+ <b><a href="wicket/">wicket/</a></b>
+ </p>
+ <p>
+ provides accesses to a generic UI for end-users,
+ Isis' <a href="http://isis.apache.org/components/viewers/wicket/about.html" target="_blank">Wicket Viewer</a>.
+ As its name suggests, this viewer is built on top of <a href="http://wicket.apache.org" target="_blank">Apache Wicket</a>™.
+ </p>
+ </li>
+ <li>
+ <p>
+ <b>
+ <a href="restful/">restful/</a>
+ </b>
+ </p>
+ <p>
+ provides access to a RESTful API conformant with the
+ <a href="http://restfulobjects.org">Restful Objects</a> spec</td>. This is part of Isis Core. The
+ implementation technology is JBoss RestEasy.
+ </p>
+ </li>
+ <li>
+ <p>
+ <b>
+ <a href="cy2neo/index.html">cy2neo/</a>
+ </b>
+ </p>
+ <p>
+ provides a lightweight graph DB visualizer.
+ </p>
+ </li>
+ </ul>
+
+ <p>
+ The default user/password is <b><i>sven/pass</i></b> (as configured in the
+ <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/webapp/src/main/webapp/WEB-INF/shiro.ini" target="_blank">shiro.ini</a> file).
+ </p>
+
+ </div>
+ </body>
+</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/css/application.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/css/application.css b/example/application/neoapp/webapp/src/main/webapp/css/application.css
new file mode 100644
index 0000000..9f1612a
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/css/application.css
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/bower.json
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/bower.json b/example/application/neoapp/webapp/src/main/webapp/cy2neo/bower.json
new file mode 100644
index 0000000..a3f7a95
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/bower.json
@@ -0,0 +1,31 @@
+{
+ "name": "cy2neo",
+ "version": "0.0.1",
+ "authors": [
+ "Michael Hunger <gi...@jexp.de>"
+ ],
+ "description": "Cy2Neo Tiny Neo4j Cypher Workbench with Alchemy.js Viz",
+ "main": "cy2neo.js",
+ "keywords": [
+ "neo4j",
+ "cypher",
+ "graph",
+ "database",
+ "repl",
+ "shell",
+ "console",
+ "graphviz",
+ "d3",
+ "graph"
+ ],
+ "license": "MIT",
+ "homepage": "http://jexp.github.io/cy2neo",
+ "private": true,
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ]
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/index.html
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/index.html b/example/application/neoapp/webapp/src/main/webapp/cy2neo/index.html
new file mode 100644
index 0000000..6f06a53
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/index.html
@@ -0,0 +1,135 @@
+<html>
+<head>
+<link rel="stylesheet" href="../scripts/alchemy/styles/vendor.css">
+<link rel="stylesheet" href="../scripts/alchemy/alchemy.css">
+<link rel="stylesheet" href="styles/codemirror.css">
+<link rel="stylesheet" href="styles/codemirror-neo.css">
+<link rel="stylesheet" href="styles/cy2neo.css">
+<link rel="stylesheet" href="styles/gh-fork-ribbon.css">
+<link rel="shortcut icon" href="a70134cc.alchemyFlatfavicon.ico">
+<title>Cy2Neo - Tiny Neo4j Cypher Workbench</title>
+</head>
+<body>
+ <div>
+ <input class="form-control" type="url" value="http://localhost:7474" id="neo4jUrl"/>
+ <textarea name="cypher" id="cypher" rows="4" cols="120" data-lang="cypher" class="code form-control">
+START x = node(*)
+MATCH (x)-[r?]->(m)
+RETURN x, r
+
+ </textarea>
+ <a href="#" title="Execute" id="execute"><i class="fa fa-play-circle-o"></i></a>
+ </div>
+
+<div class="alchemy tab-pane active" id="graph"></div>
+
+<!-- <ul class="nav nav-tabs" role="tablist">
+ <li class="active"><a href="#graph" role="tab" data-toggle="tab">Graph</a></li>
+ <li><a href="#table" role="tab" data-toggle="tab">Table</a></li>
+</ul> -->
+
+<!-- <div class="tab-content">
+ <div class="alchemy tab-pane active" id="graph"></div>
+ <div class="tab-pane" id="table">table</div>
+</div> -->
+<div id="alchemy" class="alchemy"></div>
+
+<div class="github-fork-ribbon-wrapper right-bottom">
+ <div class="github-fork-ribbon">
+ <a href="https://github.com/jexp/cy2neo">Fork me on GitHub</a>
+ </div>
+</div>
+
+
+<script src="scripts/codemirror.js"></script>
+<script src="scripts/codemirror-cypher.js"></script>
+<script src="scripts/alchemyConfig.js"></script>
+<script src="../scripts/alchemy/scripts/vendor.js"></script>
+<script src="../scripts/alchemy/alchemy.js"></script>
+<script src="scripts/neo.js"></script>
+
+<style type="text/css" media="screen">
+/* todo dynamic CSS */
+ .Movie circle {
+ fill: #00ff0e;
+ stroke: #00ffda;
+ }
+
+ .Person circle {
+ fill: #ff7921;
+ stroke: #4f07ff;
+ }
+</style>
+<script type="text/javascript">
+
+ function createEditor() {
+ return CodeMirror.fromTextArea(document.getElementById("cypher"), {
+ parserfile: ["scripts/codemirror-cypher.js"],
+ path: "scripts",
+ stylesheet: "styles/codemirror-neo.css",
+ autoMatchParens: true,
+ lineNumbers: true,
+ enterMode: "keep",
+ value: "some value"
+ });
+ }
+
+
+ $(document).ready(function() {
+
+ //todo dynamic configuration
+ //config.nodeTypes = "label"; // { type : ["NodeType1", "NodeType2", "AnotherNodeType"]};
+
+ //config.nodeCaption=function(n) {return n.name || n.title;};
+ /* config.edgeCaption={"caption":["ACTED_IN","DIRECTED","PRODUCED","REVIEWED","WROTE"]}; */
+ /* config.nodeMouseOver = function(n) {return n.id + "<br/>"+n.name || n.title;}; */
+ /* config.nodeMouseOver = function(n) {return "test";}; */
+
+
+ config.neo4jUrl="http://localhost:7474/db/data/cypher";
+
+ alchemy = new Alchemy(config);
+ alchemy.begin(config);
+
+ var neo = new Neo(function() { return config.neo4jUrl; });
+ var editor = createEditor();
+
+ $("#execute").click(function(evt) {
+ try {
+ /* var allEdges = alchemy.get.edges().all();
+ allEdges.forEach(function(edge){
+ edge.remove();
+ });
+ var allNodes = alchemy.get.nodes().all();
+ allNodes.forEach(function(node){
+ node.remove();
+ }); */
+ evt.preventDefault();
+ var query = editor.getValue();
+ console.log("Executing Query",query);
+ neo.executeQuery(query,{},function(err,res) {
+ res = res || {}
+ var graph=res.graph;
+ var labels = res.labels;
+ config.nodeTypes = {type: labels};
+ if (err) {
+ alchemy.conf.warningMessage=JSON.stringify(err);
+ alchemy.startGraph(null);
+ } else {
+ alchemy.startGraph(graph);
+ }
+ });
+ } catch(e) {
+ console.log(e);
+ }
+ return false;
+ });
+
+ //new Cy2Neo(config,"graph","cypher","execute", function() { return $("#neo4jUrl").val(); });
+ });
+
+
+
+</script>
+</body>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/alchemyConfig.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/alchemyConfig.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/alchemyConfig.js
new file mode 100644
index 0000000..a3c75f8
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/alchemyConfig.js
@@ -0,0 +1,33 @@
+var config = {
+
+ /* cluster : true, */
+
+ nodeCaption : "name",
+ /* rootNodeRadius : 30, */
+
+ /*showControlDash : true,
+
+ showStats : true,
+ nodeStats : true,
+
+ showFilters : true,
+ nodeFilters : true,*/
+
+/* captionToggle : true,
+ edgesToggle : true,
+ nodesToggle : true,*/
+ toggleRootNotes : false,
+
+ zoomControls : true,
+
+ dataSource : {
+ nodes : [],
+ edges : []
+ },
+ forceLocked : false,
+ alpha : 0.8,
+ edgeTypes : "caption",
+ directedEdges: true
+};
+
+// alchemy.begin(config)
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror-cypher.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror-cypher.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror-cypher.js
new file mode 100644
index 0000000..24f9d7a
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror-cypher.js
@@ -0,0 +1,190 @@
+// Generated by CoffeeScript 1.6.3
+/*!
+Copyright (c) 2002-2014 "Neo Technology,"
+Network Engine for Objects in Lund AB [http://neotechnology.com]
+
+This file is part of Neo4j.
+
+Neo4j is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+(function() {
+ var wordRegexp;
+
+ wordRegexp = function(words) {
+ return new RegExp("^(?:" + words.join("|") + ")$", "i");
+ };
+
+ CodeMirror.defineMode("cypher", function(config) {
+ var curPunc, funcs, indentUnit, keywords, operatorChars, popContext, preds, pushContext, tokenBase, tokenLiteral;
+ tokenBase = function(stream, state) {
+ var ch, curPunc, type, word;
+ ch = stream.next();
+ curPunc = null;
+ if (ch === "\"" || ch === "'") {
+ stream.match(/.+?["']/);
+ return "string";
+ }
+ if (/[{}\(\),\.;\[\]]/.test(ch)) {
+ curPunc = ch;
+ return "node";
+ } else if (ch === "/" && stream.eat("/")) {
+ stream.skipToEnd();
+ return "comment";
+ } else if (operatorChars.test(ch)) {
+ stream.eatWhile(operatorChars);
+ return null;
+ } else {
+ stream.eatWhile(/[_\w\d]/);
+ if (stream.eat(":")) {
+ stream.eatWhile(/[\w\d_\-]/);
+ return "atom";
+ }
+ word = stream.current();
+ type = void 0;
+ if (funcs.test(word)) {
+ return "builtin";
+ }
+ if (preds.test(word)) {
+ return "def";
+ } else if (keywords.test(word)) {
+ return "keyword";
+ } else {
+ return "variable";
+ }
+ }
+ };
+ tokenLiteral = function(quote) {
+ return function(stream, state) {
+ var ch, escaped;
+ escaped = false;
+ ch = void 0;
+ while ((ch = stream.next()) != null) {
+ if (ch === quote && !escaped) {
+ state.tokenize = tokenBase;
+ break;
+ }
+ escaped = !escaped && ch === "\\";
+ }
+ return "string";
+ };
+ };
+ pushContext = function(state, type, col) {
+ return state.context = {
+ prev: state.context,
+ indent: state.indent,
+ col: col,
+ type: type
+ };
+ };
+ popContext = function(state) {
+ state.indent = state.context.indent;
+ return state.context = state.context.prev;
+ };
+ indentUnit = config.indentUnit;
+ curPunc = void 0;
+ funcs = wordRegexp(["abs", "acos", "allShortestPaths", "asin", "atan", "atan2", "avg", "ceil", "coalesce", "collect", "cos", "cot", "count", "degrees", "e", "endnode", "exp", "extract", "filter", "floor", "haversin", "head", "id", "labels", "last", "left", "length", "log", "log10", "lower", "ltrim", "max", "min", "node", "nodes", "percentileCont", "percentileDisc", "pi", "radians", "rand", "range", "reduce", "rel", "relationship", "relationships", "replace", "right", "round", "rtrim", "shortestPath", "sign", "sin", "split", "sqrt", "startnode", "stdev", "stdevp", "str", "substring", "sum", "tail", "tan", "timestamp", "toFloat", "toInt", "trim", "type", "upper"]);
+ preds = wordRegexp(["all", "and", "any", "has", "in", "none", "not", "or", "single", "xor"]);
+ keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "distinct", "drop", "else", "end", "false", "foreach", "from", "headers", "in", "index", "is", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "remove", "return", "scan", "set", "skip", "start", "then", "true", "union", "unique", "using", "when", "where", "with"]);
+ operatorChars = /[*+\-<>=&|~%^]/;
+ return {
+ startState: function(base) {
+ return {
+ tokenize: tokenBase,
+ context: null,
+ indent: 0,
+ col: 0
+ };
+ },
+ token: function(stream, state) {
+ var style;
+ if (stream.sol()) {
+ if (state.context && (state.context.align == null)) {
+ state.context.align = false;
+ }
+ state.indent = stream.indentation();
+ }
+ if (stream.eatSpace()) {
+ return null;
+ }
+ style = state.tokenize(stream, state);
+ if (style !== "comment" && state.context && (state.context.align == null) && state.context.type !== "pattern") {
+ state.context.align = true;
+ }
+ if (curPunc === "(") {
+ pushContext(state, ")", stream.column());
+ } else if (curPunc === "[") {
+ pushContext(state, "]", stream.column());
+ } else if (curPunc === "{") {
+ pushContext(state, "}", stream.column());
+ } else if (/[\]\}\)]/.test(curPunc)) {
+ while (state.context && state.context.type === "pattern") {
+ popContext(state);
+ }
+ if (state.context && curPunc === state.context.type) {
+ popContext(state);
+ }
+ } else if (curPunc === "." && state.context && state.context.type === "pattern") {
+ popContext(state);
+ } else if (/atom|string|variable/.test(style) && state.context) {
+ if (/[\}\]]/.test(state.context.type)) {
+ pushContext(state, "pattern", stream.column());
+ } else if (state.context.type === "pattern" && !state.context.align) {
+ state.context.align = true;
+ state.context.col = stream.column();
+ }
+ }
+ return style;
+ },
+ indent: function(state, textAfter) {
+ var closing, context, firstChar;
+ firstChar = textAfter && textAfter.charAt(0);
+ context = state.context;
+ if (/[\]\}]/.test(firstChar)) {
+ while (context && context.type === "pattern") {
+ context = context.prev;
+ }
+ }
+ closing = context && firstChar === context.type;
+ if (!context) {
+ return 0;
+ } else if (context.type === "keywords") {
+ return newlineAndIndent;
+ } else if (context.align) {
+ return context.col + (closing ? 0 : 1);
+ } else {
+ return context.indent + (closing ? 0 : indentUnit);
+ }
+ }
+ };
+ });
+
+ CodeMirror.modeExtensions["cypher"] = {
+ autoFormatLineBreaks: function(text) {
+ var i, lines, reProcessedPortion;
+ lines = text.split("\n");
+ reProcessedPortion = /\s+\b(return|where|order by|match|with|skip|limit|create|delete|set)\b\s/g;
+ i = 0;
+ while (i < lines.length) {
+ lines[i] = lines[i].replace(reProcessedPortion, " \n$1 ").trim();
+ i++;
+ }
+ return lines.join("\n");
+ }
+ };
+
+ CodeMirror.defineMIME("application/x-cypher-query", "cypher");
+
+}).call(this);
[11/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Dispatcher.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Dispatcher.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Dispatcher.java
new file mode 100644
index 0000000..82c67c1
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Dispatcher.java
@@ -0,0 +1,484 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import java.util.TimeZone;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.config.ConfigurationConstants;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.commons.factory.InstanceUtil;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
+import org.apache.isis.viewer.scimpi.dispatcher.action.ActionAction;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Debug;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugAction;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugHtmlWriter;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUserAction;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsers;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.LogAction;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.EditAction;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.RemoveAction;
+import org.apache.isis.viewer.scimpi.dispatcher.logon.LogonAction;
+import org.apache.isis.viewer.scimpi.dispatcher.logon.LogoutAction;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Encoder;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.HtmlFileParser;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.ProcessorLookup;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.SimpleEncoder;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.TagProcessingException;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+import org.apache.isis.viewer.scimpi.dispatcher.view.Snippet;
+
+public class Dispatcher {
+ private static final String SHOW_UNSHOWN_MESSAGES = ConfigurationConstants.ROOT + "scimpi.show-unshown-messages";
+ public static final String ACTION = "_action";
+ public static final String EDIT = "_edit";
+ public static final String REMOVE = "_remove";
+ public static final String GENERIC = "_generic";
+ public static final String EXTENSION = "shtml";
+ private static final Logger LOG = LoggerFactory.getLogger(Dispatcher.class);
+ public static final String COMMAND_ROOT = ".app";
+ private final Map<String, Action> actions = new HashMap<String, Action>();
+ private final Map<String, String> parameters = new HashMap<String, String>();
+ private final ProcessorLookup processors = new ProcessorLookup();
+ private final HtmlFileParser parser = new HtmlFileParser(processors);
+ private final Encoder encoder = new SimpleEncoder();
+ private boolean showUnshownMessages;
+
+ public void process(final RequestContext context, final String servletPath) {
+ LOG.debug("processing request " + servletPath);
+ final AuthenticationSession session = UserManager.startRequest(context);
+ LOG.debug("exsiting session: " + session);
+
+ String language = (String) context.getVariable("user-language");
+ if (language != null) {
+ Locale locale = Util.locale(language);
+ TimeZone timeZone = Util.timeZone((String) context.getVariable("user-time-zone"));
+ // IsisContext.getUserProfile().setLocalization(new UserLocalization(locale, timeZone));
+ }
+
+ IsisContext.getPersistenceSession().getTransactionManager().startTransaction();
+ context.setRequestPath(servletPath);
+ context.startRequest();
+
+ try {
+ processActions(context, false, servletPath);
+ processTheView(context);
+ } catch (final ScimpiNotFoundException e) {
+ if (context.isInternalRequest()) {
+ LOG.error("invalid page request (from within application): " + e.getMessage());
+ ErrorCollator error = new ErrorCollator();
+ error.missingFile("Failed to find page " + servletPath + ".");
+ show500ErrorPage(context, e, error);
+ } else {
+ LOG.info("invalid page request (from outside application): " + e.getMessage());
+ show404ErrorPage(context, servletPath);
+ }
+ } catch (final NotLoggedInException e) {
+ redirectToLoginPage(context);
+ } catch (final Throwable e) {
+ ErrorCollator error = new ErrorCollator();
+ final PersistenceSession checkSession = IsisContext.getPersistenceSession();
+ final IsisTransactionManager transactionManager = checkSession.getTransactionManager();
+ if (transactionManager.getTransaction() != null && transactionManager.getTransaction().getState().canAbort()) {
+ transactionManager.abortTransaction();
+ transactionManager.startTransaction();
+ }
+
+ final Throwable ex = e instanceof TagProcessingException ? e.getCause() : e;
+ if (ex instanceof ForbiddenException) {
+ LOG.error("invalid access to " + servletPath, e);
+ show403ErrorPage(context, error, e, ex);
+ } else {
+ LOG.error("error procesing " + servletPath, e);
+ if (context.getErrorMessage() != null) {
+ fallbackToSimpleErrorPage(context, e);
+ } else {
+ show500ErrorPage(context, e, error);
+ }
+ }
+ } finally {
+ try {
+ UserManager.endRequest(context.getSession());
+ } catch (final Exception e1) {
+ LOG.error("endRequest call failed", e1);
+ }
+ }
+ }
+
+ private void redirectToLoginPage(final RequestContext context) {
+ IsisContext.getMessageBroker().addWarning(
+ "You are not currently logged in! Please log in so you can continue.");
+ context.setRequestPath("/login.shtml");
+ try {
+ processTheView(context);
+ } catch (final IOException e1) {
+ throw new ScimpiException(e1);
+ }
+ }
+
+ private void show404ErrorPage(final RequestContext context, final String servletPath) {
+ ErrorCollator error = new ErrorCollator();
+ error.missingFile("Failed to find page " + servletPath + ".");
+ context.raiseError(404, error);
+ }
+
+ private void show403ErrorPage(final RequestContext context, ErrorCollator error, final Throwable e, final Throwable ex) {
+ DebugBuilder debug = error.getDebug();
+ error.message(e);
+ error.message(ex);
+
+ final List<String> roles = ((ForbiddenException) ex).getRoles();
+ final StringBuffer roleList = new StringBuffer();
+ for (final String role : roles) {
+ if (roleList.length() > 0) {
+ roleList.append("|");
+ }
+ roleList.append(role);
+ }
+ final Identifier identifier = ((ForbiddenException) ex).getIdentifier();
+ if (identifier != null) {
+ debug.appendln("Class", identifier.toClassIdentityString() + ":" + roleList);
+ debug.appendln("Member",identifier.toClassAndNameIdentityString() + ":" + roleList);
+ debug.appendln("Other",identifier.toFullIdentityString() + ":" + roleList);
+ }
+
+ error.compileError(context);
+ context.raiseError(403, error);
+ }
+
+ private void show500ErrorPage(final RequestContext context, final Throwable e, ErrorCollator error) {
+ error.exception(e);
+ error.compileError(context);
+ context.raiseError(500, error);
+ }
+
+ private void fallbackToSimpleErrorPage(final RequestContext context, final Throwable e) {
+ context.setContentType("text/html");
+ final PrintWriter writer = context.getWriter();
+ writer.write("<html><head><title>Error</title></head>");
+ writer.write("<body><h1>Error</h1>");
+ writer.write("<p>Error while processing error</p><pre>");
+ e.printStackTrace(writer);
+ writer.write("</pre></body></html>");
+ writer.close();
+ LOG.error("Error while processing error", e);
+ }
+
+ protected void processTheView(final RequestContext context) throws IOException {
+ IsisTransactionManager transactionManager = IsisContext.getPersistenceSession().getTransactionManager();
+ if (transactionManager.getTransaction().getState().canFlush()) {
+ transactionManager.flushTransaction();
+ }
+ processView(context);
+ // Note - the session will have changed since the earlier call if a user
+ // has logged in or out in the action
+ // processing above.
+ transactionManager = IsisContext.getPersistenceSession().getTransactionManager();
+ if (transactionManager.getTransaction().getState().canCommit()) {
+ IsisContext.getPersistenceSession().getTransactionManager().endTransaction();
+ }
+
+ context.endRequest();
+ UserManager.endRequest(context.getSession());
+ }
+
+ public void addParameter(final String name, final String value) {
+ parameters.put(name, value);
+ }
+
+ private String getParameter(final String name) {
+ return parameters.get(name);
+ }
+
+ private void processActions(final RequestContext context, final boolean userLoggedIn, final String actionName) throws IOException {
+ if (actionName.endsWith(COMMAND_ROOT)) {
+ final int pos = actionName.lastIndexOf('/');
+ final Action action = actions.get(actionName.substring(pos, actionName.length() - COMMAND_ROOT.length()));
+ if (action == null) {
+ throw new ScimpiException("No logic for " + actionName);
+ }
+
+ LOG.debug("processing action: " + action);
+ action.process(context);
+ final String fowardTo = context.forwardTo();
+ if (fowardTo != null) {
+ processActions(context, true, fowardTo);
+ }
+ }
+ }
+
+ private void processView(final RequestContext context) throws IOException {
+ String file = context.getRequestedFile();
+ if (file == null) {
+ LOG.warn("No view specified to process");
+ return;
+ }
+ if (file.endsWith(COMMAND_ROOT)) {
+ return;
+ }
+ file = determineFile(context, file);
+ final String fullPath = context.requestedFilePath(file);
+ LOG.debug("processing file " + fullPath);
+ context.setResourcePath(fullPath);
+
+ context.setContentType("text/html");
+
+ context.addVariable("title", "Untitled Page", Scope.REQUEST);
+ final Stack<Snippet> tags = loadPageTemplate(context, fullPath);
+ final Request request = new Request(file, context, encoder, tags, processors);
+ request.appendDebug("processing " + fullPath);
+ try {
+ request.processNextTag();
+ noteIfMessagesHaveNotBeenDisplay(context);
+ } catch (final RuntimeException e) {
+ IsisContext.getMessageBroker().getMessages();
+ IsisContext.getMessageBroker().getWarnings();
+ throw e;
+ }
+ final String page = request.popBuffer();
+ final PrintWriter writer = context.getWriter();
+ writer.write(page);
+ if (context.getDebug() == Debug.PAGE) {
+ final DebugHtmlWriter view = new DebugHtmlWriter(writer, false);
+ context.append(view);
+ }
+ }
+
+ public void noteIfMessagesHaveNotBeenDisplay(final RequestContext context) {
+ final List<String> messages = IsisContext.getMessageBroker().getMessages();
+ if (showUnshownMessages) {
+ if (messages.size() > 0) {
+ context.getWriter().println("<ol class=\"messages forced\">");
+ for (String message : messages) {
+ context.getWriter().println("<li>" + message + "</li>");
+ }
+ context.getWriter().println("</ol>");
+ }
+ final List<String> warnings = IsisContext.getMessageBroker().getWarnings();
+ if (warnings.size() > 0) {
+ context.getWriter().println("<ol class=\"warnings forced\">");
+ for (String message : warnings) {
+ context.getWriter().println("<li>" + message + "</li>");
+ }
+ context.getWriter().println("</ol>");
+ }
+ }
+ }
+
+ private String determineFile(final RequestContext context, String file) {
+ final String fileName = file.trim();
+ if (fileName.startsWith(GENERIC)) {
+ final Object result = context.getVariable(RequestContext.RESULT);
+ final ObjectAdapter mappedObject = MethodsUtils.findObject(context, (String) result);
+ if (mappedObject == null) {
+ throw new ScimpiException("No object mapping for " + result);
+ }
+ if (fileName.equals(GENERIC + "." + EXTENSION)) {
+ final Facet facet = mappedObject.getSpecification().getFacet(CollectionFacet.class);
+ if (facet != null) {
+ final ObjectSpecification specification = mappedObject.getSpecification();
+ final TypeOfFacet facet2 = specification.getFacet(TypeOfFacet.class);
+ file = findFileForSpecification(context, facet2.valueSpec(), "collection", EXTENSION);
+ } else {
+ final ObjectAdapter mappedObject2 = mappedObject;
+ if (mappedObject2.isTransient()) {
+ file = findFileForSpecification(context, mappedObject.getSpecification(), "edit", EXTENSION);
+ } else {
+ file = findFileForSpecification(context, mappedObject.getSpecification(), "object", EXTENSION);
+ }
+ }
+ } else if (fileName.equals(GENERIC + EDIT + "." + EXTENSION)) {
+ file = findFileForSpecification(context, mappedObject.getSpecification(), "edit", EXTENSION);
+ } else if (fileName.equals(GENERIC + ACTION + "." + EXTENSION)) {
+ final String method = context.getParameter("method");
+ file = findFileForSpecification(context, mappedObject.getSpecification(), method, "action", EXTENSION);
+ }
+ }
+ return file;
+ }
+
+ private String findFileForSpecification(final RequestContext context, final ObjectSpecification specification, final String name, final String extension) {
+ return findFileForSpecification(context, specification, name, name, extension);
+ }
+
+ private String findFileForSpecification(final RequestContext context, final ObjectSpecification specification, final String name, final String defaultName, final String extension) {
+
+ String find = findFile(context, specification, name, extension);
+ if (find == null) {
+ find = "/generic/" + defaultName + "." + extension;
+ }
+ return find;
+ }
+
+ private String findFile(final RequestContext context, final ObjectSpecification specification, final String name, final String extension) {
+ final String className = specification.getShortIdentifier();
+ String fileName = context.findFile("/" + className + "/" + name + "." + extension);
+ if (fileName == null) {
+ final List<ObjectSpecification> interfaces = specification.interfaces();
+ for (int i = 0; i < interfaces.size(); i++) {
+ fileName = findFile(context, interfaces.get(i), name, extension);
+ if (fileName != null) {
+ return fileName;
+ }
+ }
+ if (specification.superclass() != null) {
+ fileName = findFile(context, specification.superclass(), name, extension);
+ }
+ }
+ return fileName;
+ }
+
+ private Stack<Snippet> loadPageTemplate(final RequestContext context, final String path) throws IOException, FileNotFoundException {
+ // TODO cache stacks and check for them first
+ copyParametersToVariableList(context);
+ LOG.debug("parsing source " + path);
+ return parser.parseHtmlFile(path, context);
+ }
+
+ private void copyParametersToVariableList(final RequestContext context) {
+ /*
+ * Enumeration parameterNames = context.getParameterNames(); while
+ * (parameterNames.hasMoreElements()) { String name = (String)
+ * parameterNames.nextElement(); if (!name.equals("view")) {
+ * context.addVariable(name, context.getParameter(name), Scope.REQUEST);
+ * } }
+ */
+ }
+
+ public void init(final String dir, final DebugUsers debugUsers) {
+ addAction(new ActionAction());
+
+ // TODO remove
+ addAction(new DebugAction(this));
+ addAction(new DebugUserAction(debugUsers));
+ addAction(new EditAction());
+ addAction(new RemoveAction());
+ addAction(new LogonAction());
+ addAction(new LogoutAction());
+ addAction(new LogAction());
+
+ final String configFile = getParameter("config");
+ if (configFile != null) {
+ final File file = new File(dir, configFile);
+ if (file.exists()) {
+ loadConfigFile(file);
+ } else {
+ throw new ScimpiException("Configuration file not found: " + configFile);
+ }
+ }
+
+ processors.init();
+ processors.addElementProcessor(new org.apache.isis.viewer.scimpi.dispatcher.view.debug.Debug(this));
+
+ showUnshownMessages = IsisContext.getConfiguration().getBoolean(SHOW_UNSHOWN_MESSAGES, true);
+ }
+
+ private void loadConfigFile(final File file) {
+ try {
+ Document document;
+ final SAXReader reader = new SAXReader();
+ document = reader.read(file);
+ final Element root = document.getRootElement();
+ for (final Iterator i = root.elementIterator(); i.hasNext();) {
+ final Element element = (Element) i.next();
+
+ if (element.getName().equals("actions")) {
+ for (final Iterator actions = element.elementIterator("action"); actions.hasNext();) {
+ final Element action = (Element) actions.next();
+ final String className = action.getText();
+ final Action instance = (Action) InstanceUtil.createInstance(className);
+ addAction(instance);
+ }
+ }
+
+ if (element.getName().equals("processors")) {
+ for (final Iterator processors = element.elementIterator("processor"); processors.hasNext();) {
+ final Element processor = (Element) processors.next();
+ final String className = processor.getText();
+ final ElementProcessor instance = (ElementProcessor) InstanceUtil.createInstance(className);
+ this.processors.addElementProcessor(instance);
+ }
+ }
+
+ }
+ } catch (final DocumentException e) {
+ throw new IsisException(e);
+ }
+
+ }
+
+ private void addAction(final Action action) {
+ actions.put("/" + action.getName(), action);
+ action.init();
+ }
+
+ public void debug(final DebugBuilder debug) {
+ debug.startSection("Actions");
+ final Set<String> keySet = actions.keySet();
+ final ArrayList<String> list = new ArrayList<String>(keySet);
+ Collections.sort(list);
+ for (final String name : list) {
+ debug.appendln(name, actions.get(name));
+ }
+ /*
+ * new ArrayList<E>(actions.keySet().iterator()) Iterator<String> names
+ * = Collections.sort().iterator(); while (names.hasNext()) { String
+ * name = names.next(); view.appendRow(name, actions.get(name)); }
+ */
+ final Iterator<Action> iterator = actions.values().iterator();
+ while (iterator.hasNext()) {
+ iterator.next().debug(debug);
+ }
+
+ processors.debug(debug);
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementContentProcessor.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementContentProcessor.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementContentProcessor.java
new file mode 100644
index 0000000..eaae2ac
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementContentProcessor.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+public interface ElementContentProcessor extends ElementProcessor {
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementProcessor.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementProcessor.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementProcessor.java
new file mode 100644
index 0000000..471ac00
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ElementProcessor.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public interface ElementProcessor {
+
+ String getName();
+
+ void process(Request request);
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ErrorCollator.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ErrorCollator.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ErrorCollator.java
new file mode 100644
index 0000000..97e297e
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ErrorCollator.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.commons.config.ConfigurationConstants;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.commons.debug.DebugHtmlString;
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.commons.debug.DebugTee;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugHtmlWriter;
+
+public class ErrorCollator {
+ private static final Logger LOG = LoggerFactory.getLogger(ErrorCollator.class);
+
+ private String errorRef;
+ private String message;
+ private final DebugString debugText = new DebugString();
+ private final DebugHtmlString debugHtml = new DebugHtmlString();
+ private final DebugBuilder debug = new DebugTee(debugText, debugHtml);
+
+ public void missingFile(String message) {
+ this.message = message;
+ }
+
+ public void message(final Throwable exception) {
+ LOG.debug(exception.getMessage(), exception);
+ message = exception.getMessage();
+ debug.appendPreformatted(message);
+ }
+
+ public void exception(final Throwable exception) {
+ String messageText = exception.getMessage();
+ LOG.debug(messageText, exception);
+ try {
+ debug.startSection("Exception");
+ debug.appendException(exception);
+ debug.endSection();
+ } catch (final RuntimeException e) {
+ debug.appendln("NOTE - an exception occurred while dumping an exception!");
+ debug.appendException(e);
+ }
+ message = messageText == null ? exception.getClass().getName() : messageText;
+ }
+
+ public DebugBuilder getDebug() {
+ return debug;
+ }
+
+ public void compileError(final RequestContext requestContext) {
+ errorRef = Long.toString(System.currentTimeMillis(), 36).toUpperCase();
+ LOG.info("error " + errorRef);
+
+ captureWarningsAndMessages();
+ dumpDebugDetails(requestContext);
+ writeErrorFile();
+ }
+
+ private void captureWarningsAndMessages() {
+ // Capture warnings/messages
+ if (IsisContext.getCurrentTransaction() != null) {
+ final List<String> messages = IsisContext.getMessageBroker().getMessages();
+ final List<String> warnings = IsisContext.getMessageBroker().getWarnings();
+ if (messages.size() > 0 || messages.size() > 0) {
+ debug.startSection("Warnings/Messages");
+ for (final String message : messages) {
+ debug.appendln("message", message);
+ }
+ for (final String message : warnings) {
+ debug.appendln("warning", message);
+ }
+ }
+ }
+ }
+
+ private void dumpDebugDetails(final RequestContext requestContext) {
+ // Dump page debug details
+ requestContext.append(debug);
+
+ debug.startSection("Processing Trace");
+ debug.appendPreformatted(requestContext.getDebugTrace());
+ debug.endSection();
+ debug.close();
+ }
+
+ private void writeErrorFile() {
+ LOG.error(message + "\n" + debugText.toString());
+
+
+ PrintWriter writer;
+ try {
+ final String directory =
+ IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.error-snapshots", ".");
+ File dir = new File(directory);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ writer = new PrintWriter(new File(dir, "error_" + errorRef + ".html"));
+ final DebugHtmlWriter writer2 = new DebugHtmlWriter(writer, true);
+ writer2.concat(debugHtml);
+ writer2.close();
+ writer.close();
+ } catch (final FileNotFoundException e) {
+ LOG.error("Failed to archive error page", e);
+ }
+ }
+
+ public String getReference() {
+ return errorRef;
+ }
+
+ public String getDetails() {
+ return debugHtml.toString();
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+
+}
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ForbiddenException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ForbiddenException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ForbiddenException.java
new file mode 100644
index 0000000..32d0c0c
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ForbiddenException.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import java.util.List;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+
+/**
+ * Indicates that request could not complete as it could not access (for
+ * security reasons) some of the content.
+ */
+public class ForbiddenException extends ScimpiException {
+ private static final long serialVersionUID = 1L;
+ public static final boolean VISIBLE_AND_USABLE = true;
+ public static final boolean VISIBLE = false;
+ private final Identifier identifier;
+ private final AuthenticationSession session;
+
+ public ForbiddenException(final String message) {
+ this(IsisContext.getAuthenticationSession(), message);
+ }
+
+ private ForbiddenException(final AuthenticationSession session, final String message) {
+ super(message + " for " + session.getUserName() + " " + session.getRoles());
+ this.session = session;
+ identifier = null;
+ }
+
+ public ForbiddenException(final IdentifiedHolder target, final boolean isVisibleAndUsabable) {
+ this(target.getIdentifier(), IsisContext.getAuthenticationSession(), isVisibleAndUsabable);
+ }
+
+ private ForbiddenException(final Identifier identifier, final AuthenticationSession session, final boolean isVisibleAndUsabable) {
+ super((identifier.getType() == Identifier.Type.PROPERTY_OR_COLLECTION ? "Field" : "Action") + " '" + identifier.getMemberName() + "' in " + identifier.getClassName() + " is not " + (isVisibleAndUsabable ? "visible/usable " : "visible") + " for " + session.getUserName() + " "
+ + session.getRoles());
+ this.identifier = identifier;
+ this.session = session;
+ }
+
+ public Identifier getIdentifier() {
+ return identifier;
+ }
+
+ public List<String> getRoles() {
+ return session.getRoles();
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Names.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Names.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Names.java
new file mode 100644
index 0000000..29b15e5
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Names.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+public interface Names {
+ static final String PREFIX = "_logon-";
+
+ static final String BUTTON_TITLE = "button-title";
+ static final String CANCEL_TO = "cancel-to";
+ static final String COLLECTION = "collection";
+ static final String CONFIRM = "confirm";
+ static final String CLASS = "class";
+ static final String CONTAINER_CLASS = "container-" + CLASS;
+ static final String DEFAULT = "default";
+ static final String ELEMENT_NAME = "element-name";
+ static final String ELEMENT = "element";
+ static final String EVEN_ROW_CLASS = "even-row";
+ static final String FALSE = "false";
+ static final String ERROR = "error";
+ static final String FIELD = "field";
+ static final String FIELD_NAME = "field-name";
+ static final String FOOTER = "footer";
+ static final String FORM_ID = "form-id";
+ static final String FORM_TITLE = "title";
+ static final String FORMS = "show-forms";
+ static final String HEADER = "header";
+ static final String ICON_CLASS = "icon";
+ static final String HIDDEN = "hidden";
+ static final String HIDE_UNEDITABLE = "hide-uneditable";
+ static final String HEADER_LEVEL = "header";
+ static final String ID = "id";
+ static final String LABEL_DELIMITER = "label";
+ static final String LINK_VIEW = "link-view";
+ static final String LINK_NAME = "link-name";
+ static final String LINK_OBJECT = "link-object";
+ static final String METHOD = "method";
+ static final String MESSAGE = "message";
+ static final String NAME = "name";
+ static final String ODD_ROW_CLASS = "odd-row";
+ static final String OBJECT = "object";
+ static final String PARAMETER = "param";
+ static final String PARAMETER_NUMBER = "number";
+ static final String PLURAL = "plural";
+ static final String REFERENCE_NAME = "reference-name";
+ static final String RESULT_NAME = "result-name";
+ static final String RESULT_OVERRIDE = "result-override";
+ static final String ROW_CLASSES = "row-classes";
+ static final String SCOPE = "scope";
+ static final String SHOW_ICON = "icon";
+ static final String SHOW_SELECT = "select";
+ static final String SHOW_EDIT = "edit";
+ static final String SHOW_DELETE = "delete";
+ static final String SHOW_MESSAGE = "show-message";
+ static final String SHOW_TITLE = "show-title";
+ static final String TRUNCATE = "truncate";
+ static final String TABLE_TITLE = "title";
+ static final String TYPE = "type";
+ static final String VIEW = "view";
+ static final String VALUE = "value";
+ static final String VERSION = "version";
+ static final String USER = "user";
+ static final String VOID = "void";
+ static final String WHEN = "when";
+ static final String ENTRY_FIELDS = "entry-fields";
+
+
+ static final String LOGON_OBJECT = PREFIX + OBJECT;
+ static final String LOGON_METHOD = PREFIX + METHOD;
+ static final String LOGON_SCOPE = PREFIX + SCOPE;
+ static final String LOGON_RESULT_NAME = PREFIX + RESULT_NAME;
+ static final String LOGON_FORM_ID = PREFIX + "form-id";
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/NotLoggedInException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/NotLoggedInException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/NotLoggedInException.java
new file mode 100644
index 0000000..9cd54a3
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/NotLoggedInException.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+/**
+ * Indicates that request could not complete as a user was not logged in.
+ */
+public class NotLoggedInException extends ScimpiException {
+ private static final long serialVersionUID = 1L;
+
+ public NotLoggedInException() {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java
new file mode 100644
index 0000000..a0ae5cf
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+
+public final class ResolveFieldUtil {
+
+ private ResolveFieldUtil(){}
+
+ /**
+ * Walking the graph.
+ *
+ * <p>
+ * This combines the implementations of both the DN Objectstore
+ * and also the in-memory objectstore.
+ * </p>
+ */
+ public static void resolveField(final ObjectAdapter object, final ObjectAssociation association) {
+
+
+ // DN impl.
+ {
+ final ObjectAdapter referencedCollectionAdapter = association.get(object);
+
+ // this code originally brought in from the JPA impl, but seems reasonable.
+ if (association.isOneToManyAssociation()) {
+ ensureThatState(referencedCollectionAdapter, is(notNullValue()));
+
+ final Object referencedCollection = referencedCollectionAdapter.getObject();
+ ensureThatState(referencedCollection, is(notNullValue()));
+
+ // if a proxy collection, then force it to initialize. just 'touching' the object is sufficient.
+ // REVIEW: I wonder if this is actually needed; does JDO use proxy collections?
+ referencedCollection.hashCode();
+ }
+
+ // the JPA impl used to also call its lifecycle listener on the referenced collection object, eg List,
+ // itself. I don't think this makes sense to do for JDO (the collection is not a PersistenceCapable).
+ }
+
+ // In-memory objectstore impl
+ {
+ final ObjectAdapter referenceAdapter = association.get(object);
+ referenceAdapter.markAsResolvedIfPossible();
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiException.java
new file mode 100644
index 0000000..18e7646
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiException.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+public class ScimpiException extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ public ScimpiException() {
+ }
+
+ public ScimpiException(final String message) {
+ super(message);
+ }
+
+ public ScimpiException(final Throwable cause) {
+ super(cause);
+ }
+
+ public ScimpiException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ public String getHtmlMessage() {
+ return getMessage();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiNotFoundException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiNotFoundException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiNotFoundException.java
new file mode 100644
index 0000000..6b1e77a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ScimpiNotFoundException.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+public class ScimpiNotFoundException extends ScimpiException {
+ public ScimpiNotFoundException() {
+ super();
+ }
+
+ public ScimpiNotFoundException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ public ScimpiNotFoundException(final String message) {
+ super(message);
+ }
+
+ public ScimpiNotFoundException(final Throwable cause) {
+ super(cause);
+ }
+
+ private static final long serialVersionUID = 1L;
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/TagOrderException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/TagOrderException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/TagOrderException.java
new file mode 100644
index 0000000..97e00e4
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/TagOrderException.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class TagOrderException extends ScimpiException {
+ private static final long serialVersionUID = 1L;
+
+ public TagOrderException(final Request request) {
+ super("Invalid tag in this context: " + request.getTag().getName());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/UserManager.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/UserManager.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/UserManager.java
new file mode 100644
index 0000000..cdb1b04
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/UserManager.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.commons.authentication.AnonymousSession;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.runtime.authentication.AuthenticationManager;
+import org.apache.isis.core.runtime.authentication.AuthenticationRequestPassword;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+
+public class UserManager {
+
+ private static final Logger LOG = LoggerFactory.getLogger(UserManager.class);
+ private static UserManager instance;
+
+ private static AuthenticationManager getAuthenticationManager() {
+ if (instance == null) {
+ throw new IllegalStateException("Server initialisation failed, or not defined as a context listener");
+ }
+ return instance.authenticationManager;
+ }
+
+ public static AuthenticationSession startRequest(final RequestContext context) {
+ AuthenticationSession session = context.getSession();
+ if (session == null) {
+ session = new AnonymousSession();
+ LOG.debug("start anonymous request: " + session);
+ } else {
+ LOG.debug("start request for: " + session.getUserName());
+ }
+ IsisContext.closeSession();
+ IsisContext.openSession(session);
+ return session;
+ }
+
+ public static AuthenticationSession authenticate(final AuthenticationRequestPassword passwordAuthenticationRequest) {
+ final AuthenticationSession session = getAuthenticationManager().authenticate(passwordAuthenticationRequest);
+ if (session != null) {
+ LOG.info("log on user " + session.getUserName());
+ IsisContext.closeSession();
+ IsisContext.openSession(session);
+ }
+ return session;
+ }
+
+ public static void endRequest(final AuthenticationSession session) {
+ if (session == null) {
+ LOG.debug("end anonymous request");
+ } else {
+ LOG.debug("end request for: " + session.getUserName());
+ }
+ IsisContext.closeSession();
+ }
+
+ public static void logoffUser(final AuthenticationSession session) {
+ LOG.info("log off user " + session.getUserName());
+ IsisContext.closeSession();
+ getAuthenticationManager().closeSession(session);
+
+ final AnonymousSession replacementSession = new AnonymousSession();
+ IsisContext.openSession(replacementSession);
+ }
+
+ private final AuthenticationManager authenticationManager;
+
+ public UserManager(final AuthenticationManager authenticationManager) {
+ this.authenticationManager = authenticationManager;
+ UserManager.instance = this;
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Util.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Util.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Util.java
new file mode 100644
index 0000000..b485dd0
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Util.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+class Util {
+
+ public static final String DEFAULT_TIME_ZONE = "Europe/London";
+ public static final String DEFAULT_LANGUAGE = "English, United Kingdom (en-gb)";
+
+
+ private Util() {}
+
+ public static boolean hasChanged(String version1, String version2) {
+ return version2 == null && version1 != null || (version2 != null && !version2.equals(version1));
+ }
+
+ public static List<String> languages() {
+ Locale[] locales = DateFormat.getAvailableLocales();
+ List<String> list = new ArrayList<String>(locales.length);
+ for (Locale locale : locales) {
+ list.add(localeName(locale));
+ }
+ Collections.sort(list);
+ return list;
+ }
+
+ public static List<String> timeZones() {
+ List<String> timezones = Arrays.asList(TimeZone.getAvailableIDs());
+ Collections.sort(timezones);
+ return timezones;
+ }
+
+ public static TimeZone timeZone(String timeZoneEntry) {
+ TimeZone timeZone = TimeZone.getTimeZone(timeZoneEntry);
+ return timeZone;
+ }
+
+ public static Locale locale(String localeCode) {
+ String substring[] = localeCode.trim().split("-");
+ Locale locale;
+ switch (substring.length) {
+ case 1:
+ locale = new Locale(substring[0]);
+ break;
+ case 2:
+ locale = new Locale(substring[0], substring[1]);
+ break;
+ case 3:
+ locale = new Locale(substring[0], substring[1], substring[3]);
+ break;
+ default:
+ locale = Locale.getDefault();
+ break;
+ }
+ return locale;
+ }
+
+ public static String languageName(String languageCode) {
+ Locale locale = locale(languageCode);
+ return localeName(locale);
+ }
+
+ public static String codeForLanguage(String language) {
+ Locale[] locales = DateFormat.getAvailableLocales();
+ for (Locale locale : locales) {
+ String name = localeName(locale);
+ if (name.equals(language)) {
+ return locale.toString().toLowerCase().replace('_', '-');
+ }
+ }
+ return null;
+ }
+
+ public static String localeName(Locale locale) {
+ String language = locale.getDisplayLanguage();
+ String country = locale.getDisplayCountry().length() == 0 ? "" : ", " + (locale.getDisplayCountry());
+ return language + country + " (" + locale.toString().toLowerCase().replace('_', '-') + ")";
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java
new file mode 100644
index 0000000..44a9756
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java
@@ -0,0 +1,268 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.action;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AnonymousSession;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.authentication.MessageBroker;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.Veto;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.Action;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+public class ActionAction implements Action {
+
+ public static final String ACTION = "action";
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ public String getName() {
+ return ACTION;
+ }
+
+ /**
+ * REVIEW - this and EditAction are very similar - refactor out common code.
+ */
+ @Override
+ public void process(final RequestContext context) throws IOException {
+ final String objectId = context.getParameter("_" + OBJECT);
+ final String version = context.getParameter("_" + VERSION);
+ final String formId = context.getParameter("_" + FORM_ID);
+ final String methodName = context.getParameter("_" + METHOD);
+ final String override = context.getParameter("_" + RESULT_OVERRIDE);
+ String resultName = context.getParameter("_" + RESULT_NAME);
+ final String message = context.getParameter("_" + MESSAGE);
+ resultName = resultName == null ? RequestContext.RESULT : resultName;
+
+ FormState entryState = null;
+ try {
+ final ObjectAdapter object = MethodsUtils.findObject(context, objectId);
+ // FIXME need to find method based on the set of parameters.
+ // otherwise overloaded method may be incorrectly
+ // selected.
+ final ObjectAction action = MethodsUtils.findAction(object, methodName);
+ entryState = validateParameters(context, action, object);
+
+ AuthenticationSession session = context.getSession();
+ if (session == null && action.isVisible(new AnonymousSession(), object, where).isVetoed()) {
+ session = new AnonymousSession();
+ }
+
+ final Version originalVersion = context.getVersion(version);
+ object.checkLock(originalVersion);
+ if (entryState.isValid()) {
+ final boolean hasResult = invokeMethod(context, resultName, object, action, entryState);
+ String view = context.getParameter(hasResult ? "_" + VIEW : "_" + VOID);
+
+ final int questionMark = view == null ? -1 : view.indexOf("?");
+ if (questionMark > -1) {
+ final String params[] = view.substring(questionMark + 1).split("&");
+ for (final String param : params) {
+ final int equals = param.indexOf("=");
+ context.addVariable(param.substring(0, equals), param.substring(equals + 1), Scope.REQUEST);
+ view = view.substring(0, questionMark);
+ }
+ }
+ context.setRequestPath(view);
+ if (message != null) {
+ final MessageBroker messageBroker = getMessageBroker();
+ messageBroker.addMessage(message);
+ }
+ if (override != null) {
+ context.addVariable(resultName, override, Scope.REQUEST);
+ }
+ if (!action.hasReturn() && context.getVariable(resultName) == null) {
+ context.addVariable(resultName, objectId, Scope.REQUEST);
+ }
+ } else {
+ entryState.setForm(formId);
+ context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
+ context.addVariable(resultName, objectId, Scope.REQUEST);
+ if (override != null) {
+ context.addVariable(resultName, override, Scope.REQUEST);
+ }
+ final String error = entryState.getError();
+ final String view = context.getParameter("_" + ERROR);
+ context.setRequestPath(view, Dispatcher.ACTION);
+
+ final MessageBroker messageBroker = getMessageBroker();
+ messageBroker.addWarning(error);
+ }
+ } catch (final ConcurrencyException e) {
+ final ObjectAdapter adapter = getAdapterManager().getAdapterFor(e.getOid());
+ String user = adapter.getOid().getVersion().getUser();
+ String errorMessage = "The data for '" + adapter.titleString() + "' was changed by " + user
+ + ". Please repeat the action based on those changes.";
+ getMessageBroker().addMessage(errorMessage);
+
+ entryState.setForm(formId);
+ context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
+ context.addVariable(resultName, objectId, Scope.REQUEST);
+ if (override != null) {
+ context.addVariable(resultName, override, Scope.REQUEST);
+ }
+ final String error = entryState.getError();
+ if (error != null) {
+ context.addVariable(RequestContext.ERROR, error, Scope.REQUEST);
+ }
+
+ final String view = context.getParameter("_" + ERROR);
+ context.setRequestPath(view, Dispatcher.ACTION);
+
+ } catch (final RuntimeException e) {
+ getMessageBroker().getMessages();
+ getMessageBroker().getWarnings();
+ throw e;
+ }
+ }
+
+ private boolean invokeMethod(final RequestContext context, final String variable, final ObjectAdapter object, final ObjectAction action, final FormState entryState) {
+
+ final ObjectAdapter[] parameters = getParameters(action, entryState);
+ final String scopeName = context.getParameter("_" + SCOPE);
+ final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
+ return MethodsUtils.runMethod(context, action, object, parameters, variable, scope);
+ }
+
+ private ObjectAdapter[] getParameters(final ObjectAction action, final FormState entryState) {
+ final int parameterCount = action.getParameterCount();
+ final ObjectAdapter[] parameters = new ObjectAdapter[parameterCount];
+ for (int i = 0; i < parameterCount; i++) {
+ parameters[i] = entryState.getField(parameterName(i)).getValue();
+ }
+ return parameters;
+ }
+
+ private FormState validateParameters(final RequestContext context, final ObjectAction action, final ObjectAdapter object) {
+ final FormState formState = new FormState();
+ final List<ObjectActionParameter> parameters2 = action.getParameters();
+ final int parameterCount = action.getParameterCount();
+ for (int i = 0; i < parameterCount; i++) {
+ final String fieldName = parameterName(i);
+ String newEntry = context.getParameter(fieldName);
+
+ if (newEntry != null && newEntry.equals("-OTHER-")) {
+ newEntry = context.getParameter(fieldName + "-other");
+ }
+
+ if (newEntry == null) {
+ // TODO figure out a better way to determine if boolean or a
+ // password
+ final ObjectSpecification spec = parameters2.get(i).getSpecification();
+ if (spec.isOfType(IsisContext.getSpecificationLoader().loadSpecification(boolean.class)) || spec.isOfType(IsisContext.getSpecificationLoader().loadSpecification(Boolean.class))) {
+ newEntry = FALSE;
+ } else {
+ newEntry = "";
+ }
+ }
+ final FieldEditState fieldState = formState.createField(fieldName, newEntry);
+ Consent consent = null;
+
+ if (!parameters2.get(i).isOptional() && newEntry.equals("")) {
+ consent = new Veto(parameters2.get(i).getName() + " required");
+ formState.setError("Not all fields have been set");
+
+ } else if (parameters2.get(i).getSpecification().getFacet(ParseableFacet.class) != null) {
+ try {
+ final ParseableFacet facet = parameters2.get(i).getSpecification().getFacet(ParseableFacet.class);
+ Localization localization = IsisContext.getLocalization();
+ final String message = parameters2.get(i).isValid(object, newEntry, localization);
+ if (message != null) {
+ consent = new Veto(message);
+ formState.setError("Not all fields are valid");
+ }
+ final ObjectAdapter entry = facet.parseTextEntry(null, newEntry, localization);
+ fieldState.setValue(entry);
+ } catch (final TextEntryParseException e) {
+ consent = new Veto(e.getMessage());
+ formState.setError("Not all fields are valid");
+ }
+ } else {
+ fieldState.setValue(newEntry == null ? null : context.getMappedObject(newEntry));
+ }
+ if (consent != null && consent.isVetoed()) {
+ fieldState.setError(consent.getReason());
+ }
+ }
+
+ if (formState.isValid()) {
+ final ObjectAdapter[] parameters = getParameters(action, formState);
+ final Consent consent = action.isProposedArgumentSetValid(object, parameters);
+ if (consent != null && consent.isVetoed()) {
+ formState.setError(consent.getReason());
+ }
+ }
+
+ return formState;
+ }
+
+ public static String parameterName(final int index) {
+ return PARAMETER + (index + 1);
+ }
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public void debug(final DebugBuilder debug) {
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // from context
+ ///////////////////////////////////////////////////////////////////////////
+
+ protected MessageBroker getMessageBroker() {
+ return IsisContext.getMessageBroker();
+ }
+
+ protected AdapterManager getAdapterManager() {
+ return IsisContext.getPersistenceSession().getAdapterManager();
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/Attributes.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/Attributes.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/Attributes.java
new file mode 100644
index 0000000..67d13e2
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/Attributes.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.action;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.htmlparser.Attribute;
+import org.htmlparser.nodes.TagNode;
+
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+
+public class Attributes {
+ private static final String TRUE = " true yes on ";
+ private static final String FALSE = " false no off ";
+ private final TagNode tagNode;
+ private final RequestContext context;
+
+ public Attributes(final TagNode tagNode, final RequestContext context) {
+ this.tagNode = tagNode;
+ this.context = context;
+ }
+
+ public boolean isPropertySet(final String name) {
+ final String attribute = tagNode.getAttribute(name);
+ int end = attribute.length() - 1;
+ final int pos = attribute.indexOf(':');
+ end = pos == -1 ? end : pos;
+ final String variabelName = attribute.substring(2, end);
+ final Object value = context.getVariable(variabelName);
+ return value != null;
+ // return attribute != null &&
+ // !context.replaceVariables(attribute).equals("");
+ }
+
+ public boolean isPropertySpecified(final String name) {
+ final String attribute = tagNode.getAttribute(name);
+ return attribute != null;
+ }
+
+ public String getOptionalProperty(final String name, final boolean ensureVariablesExists) {
+ return getOptionalProperty(name, null, ensureVariablesExists);
+ }
+
+ public String getOptionalProperty(final String name, final String defaultValue, final boolean ensureVariablesExists) {
+ final String attribute = tagNode.getAttribute(name);
+ return attribute == null ? defaultValue : context.replaceVariables(attribute);
+ }
+
+ public String getRequiredProperty(final String name, final boolean ensureVariablesExists) {
+ final String attribute = tagNode.getAttribute(name);
+ if (attribute == null) {
+ throw new RequiredPropertyException("Missing property: " + name);
+ } else if (attribute.equals("")) {
+ throw new RequiredPropertyException("Property not set: " + name);
+ } else {
+ return context.replaceVariables(attribute);
+ }
+ }
+
+ public String[] getPropertyNames(final String excluding[]) {
+ final Vector attributes = tagNode.getAttributesEx();
+ final String[] names = new String[attributes.size()];
+ int i = 0;
+ names: for (final Enumeration e = attributes.elements(); e.hasMoreElements();) {
+ final String name = ((Attribute) e.nextElement()).getName();
+ if (name == null) {
+ continue;
+ }
+ for (int j = 0; j < excluding.length; j++) {
+ if (name.equals(excluding[j])) {
+ continue names;
+ }
+ }
+ if (tagNode.getAttribute(name) != null) {
+ names[i++] = name;
+ }
+ }
+
+ final String[] array = new String[i];
+ System.arraycopy(names, 0, array, 0, i);
+ return array;
+ }
+
+ @Override
+ public String toString() {
+ return tagNode.toHtml(); // getAttributesEx().toString();
+ }
+
+ public boolean isRequested(final String name) {
+ return isRequested(name, false);
+ }
+
+ public boolean isRequested(final String name, final boolean defaultValue) {
+ final String flag = getOptionalProperty(name, true);
+ if (flag == null) {
+ return defaultValue;
+ } else {
+ return isTrue(flag);
+ }
+ }
+
+ public static boolean isTrue(final String flag) {
+ final String value = " " + flag.toLowerCase().trim() + " ";
+ if (TRUE.indexOf(value) >= 0) {
+ return true;
+ } else if (FALSE.indexOf(value) >= 0) {
+ return false;
+ } else {
+ throw new PropertyException("Illegal flag value: " + flag);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/PropertyException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/PropertyException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/PropertyException.java
new file mode 100644
index 0000000..2e42188
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/PropertyException.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.action;
+
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+
+public class PropertyException extends ScimpiException {
+
+ private static final long serialVersionUID = 1L;
+
+ public PropertyException() {
+ super();
+ }
+
+ public PropertyException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ public PropertyException(final String message) {
+ super(message);
+ }
+
+ public PropertyException(final Throwable cause) {
+ super(cause);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/RequiredPropertyException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/RequiredPropertyException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/RequiredPropertyException.java
new file mode 100644
index 0000000..20430d3
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/RequiredPropertyException.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.action;
+
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+
+public class RequiredPropertyException extends ScimpiException {
+ private static final long serialVersionUID = 1L;
+
+ public RequiredPropertyException() {
+ super();
+ }
+
+ public RequiredPropertyException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ public RequiredPropertyException(final String message) {
+ super(message);
+ }
+
+ public RequiredPropertyException(final Throwable cause) {
+ super(cause);
+ }
+
+}
[55/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror.js
deleted file mode 100644
index 48773cb..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror.js
+++ /dev/null
@@ -1,5909 +0,0 @@
-// CodeMirror is the only global var we claim
-window.CodeMirror = (function() {
- "use strict";
-
- // BROWSER SNIFFING
-
- // Crude, but necessary to handle a number of hard-to-feature-detect
- // bugs and behavior differences.
- var gecko = /gecko\/\d/i.test(navigator.userAgent);
- var ie = /MSIE \d/.test(navigator.userAgent);
- var ie_lt8 = ie && (document.documentMode == null || document.documentMode < 8);
- var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);
- var webkit = /WebKit\//.test(navigator.userAgent);
- var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);
- var chrome = /Chrome\//.test(navigator.userAgent);
- var opera = /Opera\//.test(navigator.userAgent);
- var safari = /Apple Computer/.test(navigator.vendor);
- var khtml = /KHTML\//.test(navigator.userAgent);
- var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent);
- var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);
- var phantom = /PhantomJS/.test(navigator.userAgent);
-
- var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);
- // This is woefully incomplete. Suggestions for alternative methods welcome.
- var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);
- var mac = ios || /Mac/.test(navigator.platform);
- var windows = /win/i.test(navigator.platform);
-
- var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
- if (opera_version) opera_version = Number(opera_version[1]);
- if (opera_version && opera_version >= 15) { opera = false; webkit = true; }
- // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
- var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
- var captureMiddleClick = gecko || (ie && !ie_lt9);
-
- // Optimize some code when these features are not used
- var sawReadOnlySpans = false, sawCollapsedSpans = false;
-
- // CONSTRUCTOR
-
- function CodeMirror(place, options) {
- if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
-
- this.options = options = options || {};
- // Determine effective options based on given values and defaults.
- for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt)) {
- options[opt] = defaults[opt];
- }
-console.log("CM",options)
- setGuttersForLineNumbers(options);
- var docStart = typeof options.value == "string" ? 0 : options.value.first;
- var display = this.display = makeDisplay(place, docStart);
- display.wrapper.CodeMirror = this;
- updateGutters(this);
- if (options.autofocus && !mobile) focusInput(this);
-
- this.state = {keyMaps: [],
- overlays: [],
- modeGen: 0,
- overwrite: false, focused: false,
- suppressEdits: false, pasteIncoming: false,
- draggingText: false,
- highlight: new Delayed()};
-
- themeChanged(this);
- if (options.lineWrapping)
- this.display.wrapper.className += " CodeMirror-wrap";
-
- var doc = options.value;
- if (typeof doc == "string") doc = new Doc(options.value, options.mode);
- operation(this, attachDoc)(this, doc);
-
- // Override magic textarea content restore that IE sometimes does
- // on our hidden textarea on reload
- if (ie) setTimeout(bind(resetInput, this, true), 20);
-
- registerEventHandlers(this);
- // IE throws unspecified error in certain cases, when
- // trying to access activeElement before onload
- var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { }
- if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20);
- else onBlur(this);
-
- operation(this, function() {
- for (var opt in optionHandlers)
- if (optionHandlers.propertyIsEnumerable(opt))
- optionHandlers[opt](this, options[opt], Init);
- for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
- })();
- }
-
- // DISPLAY CONSTRUCTOR
-
- function makeDisplay(place, docStart) {
- var d = {};
-
- var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none; font-size: 4px;");
- if (webkit) input.style.width = "1000px";
- else input.setAttribute("wrap", "off");
- // if border: 0; -- iOS fails to open keyboard (issue #1287)
- if (ios) input.style.border = "1px solid black";
- input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false");
-
- // Wraps and hides input textarea
- d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
- // The actual fake scrollbars.
- d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar");
- d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar");
- d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
- d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
- // DIVs containing the selection and the actual code
- d.lineDiv = elt("div", null, "CodeMirror-code");
- d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
- // Blinky cursor, and element used to ensure cursor fits at the end of a line
- d.cursor = elt("div", "\u00a0", "CodeMirror-cursor");
- // Secondary cursor, shown when on a 'jump' in bi-directional text
- d.otherCursor = elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor");
- // Used to measure text size
- d.measure = elt("div", null, "CodeMirror-measure");
- // Wraps everything that needs to exist inside the vertically-padded coordinate system
- d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor],
- null, "position: relative; outline: none");
- // Moved around its parent to cover visible view
- d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
- // Set to the height of the text, causes scrolling
- d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
- // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers
- d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerCutOff + "px; width: 1px;");
- // Will contain the gutters, if any
- d.gutters = elt("div", null, "CodeMirror-gutters");
- d.lineGutter = null;
- // Provides scrolling
- d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
- d.scroller.setAttribute("tabIndex", "-1");
- // The element in which the editor lives.
- d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV,
- d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
- // Work around IE7 z-index bug
- if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
- if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper);
-
- // Needed to hide big blue blinking cursor on Mobile Safari
- if (ios) input.style.width = "0px";
- if (!webkit) d.scroller.draggable = true;
- // Needed to handle Tab key in KHTML
- if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; }
- // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
- else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px";
-
- // Current visible range (may be bigger than the view window).
- d.viewOffset = d.lastSizeC = 0;
- d.showingFrom = d.showingTo = docStart;
-
- // Used to only resize the line number gutter when necessary (when
- // the amount of lines crosses a boundary that makes its width change)
- d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
- // See readInput and resetInput
- d.prevInput = "";
- // Set to true when a non-horizontal-scrolling widget is added. As
- // an optimization, widget aligning is skipped when d is false.
- d.alignWidgets = false;
- // Flag that indicates whether we currently expect input to appear
- // (after some event like 'keypress' or 'input') and are polling
- // intensively.
- d.pollingFast = false;
- // Self-resetting timeout for the poller
- d.poll = new Delayed();
-
- d.cachedCharWidth = d.cachedTextHeight = null;
- d.measureLineCache = [];
- d.measureLineCachePos = 0;
-
- // Tracks when resetInput has punted to just putting a short
- // string instead of the (large) selection.
- d.inaccurateSelection = false;
-
- // Tracks the maximum line length so that the horizontal scrollbar
- // can be kept static when scrolling.
- d.maxLine = null;
- d.maxLineLength = 0;
- d.maxLineChanged = false;
-
- // Used for measuring wheel scrolling granularity
- d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
-
- return d;
- }
-
- // STATE UPDATES
-
- // Used to get the editor into a consistent state again when options change.
-
- function loadMode(cm) {
- cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
- cm.doc.iter(function(line) {
- if (line.stateAfter) line.stateAfter = null;
- if (line.styles) line.styles = null;
- });
- cm.doc.frontier = cm.doc.first;
- startWorker(cm, 100);
- cm.state.modeGen++;
- if (cm.curOp) regChange(cm);
- }
-
- function wrappingChanged(cm) {
- if (cm.options.lineWrapping) {
- cm.display.wrapper.className += " CodeMirror-wrap";
- cm.display.sizer.style.minWidth = "";
- } else {
- cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", "");
- computeMaxLength(cm);
- }
- estimateLineHeights(cm);
- regChange(cm);
- clearCaches(cm);
- setTimeout(function(){updateScrollbars(cm);}, 100);
- }
-
- function estimateHeight(cm) {
- var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
- var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
- return function(line) {
- if (lineIsHidden(cm.doc, line))
- return 0;
- else if (wrapping)
- return (Math.ceil(line.text.length / perLine) || 1) * th;
- else
- return th;
- };
- }
-
- function estimateLineHeights(cm) {
- var doc = cm.doc, est = estimateHeight(cm);
- doc.iter(function(line) {
- var estHeight = est(line);
- if (estHeight != line.height) updateLineHeight(line, estHeight);
- });
- }
-
- function keyMapChanged(cm) {
- var map = keyMap[cm.options.keyMap], style = map.style;
- cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
- (style ? " cm-keymap-" + style : "");
- cm.state.disableInput = map.disableInput;
- }
-
- function themeChanged(cm) {
- cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
- cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
- clearCaches(cm);
- }
-
- function guttersChanged(cm) {
- updateGutters(cm);
- regChange(cm);
- setTimeout(function(){alignHorizontally(cm);}, 20);
- }
-
- function updateGutters(cm) {
- var gutters = cm.display.gutters, specs = cm.options.gutters;
- removeChildren(gutters);
- for (var i = 0; i < specs.length; ++i) {
- var gutterClass = specs[i];
- var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
- if (gutterClass == "CodeMirror-linenumbers") {
- cm.display.lineGutter = gElt;
- gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
- }
- }
- gutters.style.display = i ? "" : "none";
- }
-
- function lineLength(doc, line) {
- if (line.height == 0) return 0;
- var len = line.text.length, merged, cur = line;
- while (merged = collapsedSpanAtStart(cur)) {
- var found = merged.find();
- cur = getLine(doc, found.from.line);
- len += found.from.ch - found.to.ch;
- }
- cur = line;
- while (merged = collapsedSpanAtEnd(cur)) {
- var found = merged.find();
- len -= cur.text.length - found.from.ch;
- cur = getLine(doc, found.to.line);
- len += cur.text.length - found.to.ch;
- }
- return len;
- }
-
- function computeMaxLength(cm) {
- var d = cm.display, doc = cm.doc;
- d.maxLine = getLine(doc, doc.first);
- d.maxLineLength = lineLength(doc, d.maxLine);
- d.maxLineChanged = true;
- doc.iter(function(line) {
- var len = lineLength(doc, line);
- if (len > d.maxLineLength) {
- d.maxLineLength = len;
- d.maxLine = line;
- }
- });
- }
-
- // Make sure the gutters options contains the element
- // "CodeMirror-linenumbers" when the lineNumbers option is true.
- function setGuttersForLineNumbers(options) {
- var found = indexOf(options.gutters, "CodeMirror-linenumbers");
- if (found == -1 && options.lineNumbers) {
- options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);
- } else if (found > -1 && !options.lineNumbers) {
- options.gutters = options.gutters.slice(0);
- options.gutters.splice(found, 1);
- }
- }
-
- // SCROLLBARS
-
- // Re-synchronize the fake scrollbars with the actual size of the
- // content. Optionally force a scrollTop.
- function updateScrollbars(cm) {
- var d = cm.display, docHeight = cm.doc.height;
- var totalHeight = docHeight + paddingVert(d);
- d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px";
- d.gutters.style.height = Math.max(totalHeight, d.scroller.clientHeight - scrollerCutOff) + "px";
- var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight);
- var needsH = d.scroller.scrollWidth > (d.scroller.clientWidth + 1);
- var needsV = scrollHeight > (d.scroller.clientHeight + 1);
- if (needsV) {
- d.scrollbarV.style.display = "block";
- d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0";
- d.scrollbarV.firstChild.style.height =
- (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px";
- } else {
- d.scrollbarV.style.display = "";
- d.scrollbarV.firstChild.style.height = "0";
- }
- if (needsH) {
- d.scrollbarH.style.display = "block";
- d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0";
- d.scrollbarH.firstChild.style.width =
- (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px";
- } else {
- d.scrollbarH.style.display = "";
- d.scrollbarH.firstChild.style.width = "0";
- }
- if (needsH && needsV) {
- d.scrollbarFiller.style.display = "block";
- d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px";
- } else d.scrollbarFiller.style.display = "";
- if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
- d.gutterFiller.style.display = "block";
- d.gutterFiller.style.height = scrollbarWidth(d.measure) + "px";
- d.gutterFiller.style.width = d.gutters.offsetWidth + "px";
- } else d.gutterFiller.style.display = "";
-
- if (mac_geLion && scrollbarWidth(d.measure) === 0) {
- d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px";
- d.scrollbarV.style.pointerEvents = d.scrollbarH.style.pointerEvents = "none";
- }
- }
-
- function visibleLines(display, doc, viewPort) {
- var top = display.scroller.scrollTop, height = display.wrapper.clientHeight;
- if (typeof viewPort == "number") top = viewPort;
- else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;}
- top = Math.floor(top - paddingTop(display));
- var bottom = Math.ceil(top + height);
- return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)};
- }
-
- // LINE NUMBERS
-
- function alignHorizontally(cm) {
- var display = cm.display;
- if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
- var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
- var gutterW = display.gutters.offsetWidth, l = comp + "px";
- for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) {
- for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l;
- }
- if (cm.options.fixedGutter)
- display.gutters.style.left = (comp + gutterW) + "px";
- }
-
- function maybeUpdateLineNumberWidth(cm) {
- if (!cm.options.lineNumbers) return false;
- var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
- if (last.length != display.lineNumChars) {
- var test = display.measure.appendChild(elt("div", [elt("div", last)],
- "CodeMirror-linenumber CodeMirror-gutter-elt"));
- var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
- display.lineGutter.style.width = "";
- display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);
- display.lineNumWidth = display.lineNumInnerWidth + padding;
- display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
- display.lineGutter.style.width = display.lineNumWidth + "px";
- return true;
- }
- return false;
- }
-
- function lineNumberFor(options, i) {
- return String(options.lineNumberFormatter(i + options.firstLineNumber));
- }
- function compensateForHScroll(display) {
- return getRect(display.scroller).left - getRect(display.sizer).left;
- }
-
- // DISPLAY DRAWING
-
- function updateDisplay(cm, changes, viewPort, forced) {
- var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated;
- var visible = visibleLines(cm.display, cm.doc, viewPort);
- for (var first = true;; first = false) {
- var oldWidth = cm.display.scroller.clientWidth;
- if (!updateDisplayInner(cm, changes, visible, forced)) break;
- updated = true;
- changes = [];
- updateSelection(cm);
- updateScrollbars(cm);
- if (first && cm.options.lineWrapping && oldWidth != cm.display.scroller.clientWidth) {
- forced = true;
- continue;
- }
- forced = false;
-
- // Clip forced viewport to actual scrollable area
- if (viewPort)
- viewPort = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight,
- typeof viewPort == "number" ? viewPort : viewPort.top);
- visible = visibleLines(cm.display, cm.doc, viewPort);
- if (visible.from >= cm.display.showingFrom && visible.to <= cm.display.showingTo)
- break;
- }
-
- if (updated) {
- signalLater(cm, "update", cm);
- if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo)
- signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo);
- }
- return updated;
- }
-
- // Uses a set of changes plus the current scroll position to
- // determine which DOM updates have to be made, and makes the
- // updates.
- function updateDisplayInner(cm, changes, visible, forced) {
- var display = cm.display, doc = cm.doc;
- if (!display.wrapper.clientWidth) {
- display.showingFrom = display.showingTo = doc.first;
- display.viewOffset = 0;
- return;
- }
-
- // Bail out if the visible area is already rendered and nothing changed.
- if (!forced && changes.length == 0 &&
- visible.from > display.showingFrom && visible.to < display.showingTo)
- return;
-
- if (maybeUpdateLineNumberWidth(cm))
- changes = [{from: doc.first, to: doc.first + doc.size}];
- var gutterW = display.sizer.style.marginLeft = display.gutters.offsetWidth + "px";
- display.scrollbarH.style.left = cm.options.fixedGutter ? gutterW : "0";
-
- // Used to determine which lines need their line numbers updated
- var positionsChangedFrom = Infinity;
- if (cm.options.lineNumbers)
- for (var i = 0; i < changes.length; ++i)
- if (changes[i].diff && changes[i].from < positionsChangedFrom) { positionsChangedFrom = changes[i].from; }
-
- var end = doc.first + doc.size;
- var from = Math.max(visible.from - cm.options.viewportMargin, doc.first);
- var to = Math.min(end, visible.to + cm.options.viewportMargin);
- if (display.showingFrom < from && from - display.showingFrom < 20) from = Math.max(doc.first, display.showingFrom);
- if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(end, display.showingTo);
- if (sawCollapsedSpans) {
- from = lineNo(visualLine(doc, getLine(doc, from)));
- while (to < end && lineIsHidden(doc, getLine(doc, to))) ++to;
- }
-
- // Create a range of theoretically intact lines, and punch holes
- // in that using the change info.
- var intact = [{from: Math.max(display.showingFrom, doc.first),
- to: Math.min(display.showingTo, end)}];
- if (intact[0].from >= intact[0].to) intact = [];
- else intact = computeIntact(intact, changes);
- // When merged lines are present, we might have to reduce the
- // intact ranges because changes in continued fragments of the
- // intact lines do require the lines to be redrawn.
- if (sawCollapsedSpans)
- for (var i = 0; i < intact.length; ++i) {
- var range = intact[i], merged;
- while (merged = collapsedSpanAtEnd(getLine(doc, range.to - 1))) {
- var newTo = merged.find().from.line;
- if (newTo > range.from) range.to = newTo;
- else { intact.splice(i--, 1); break; }
- }
- }
-
- // Clip off the parts that won't be visible
- var intactLines = 0;
- for (var i = 0; i < intact.length; ++i) {
- var range = intact[i];
- if (range.from < from) range.from = from;
- if (range.to > to) range.to = to;
- if (range.from >= range.to) intact.splice(i--, 1);
- else intactLines += range.to - range.from;
- }
- if (!forced && intactLines == to - from && from == display.showingFrom && to == display.showingTo) {
- updateViewOffset(cm);
- return;
- }
- intact.sort(function(a, b) {return a.from - b.from;});
-
- // Avoid crashing on IE's "unspecified error" when in iframes
- try {
- var focused = document.activeElement;
- } catch(e) {}
- if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none";
- patchDisplay(cm, from, to, intact, positionsChangedFrom);
- display.lineDiv.style.display = "";
- if (focused && document.activeElement != focused && focused.offsetHeight) focused.focus();
-
- var different = from != display.showingFrom || to != display.showingTo ||
- display.lastSizeC != display.wrapper.clientHeight;
- // This is just a bogus formula that detects when the editor is
- // resized or the font size changes.
- if (different) {
- display.lastSizeC = display.wrapper.clientHeight;
- startWorker(cm, 400);
- }
- display.showingFrom = from; display.showingTo = to;
-
- updateHeightsInViewport(cm);
- updateViewOffset(cm);
-
- return true;
- }
-
- function updateHeightsInViewport(cm) {
- var display = cm.display;
- var prevBottom = display.lineDiv.offsetTop;
- for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) {
- if (ie_lt8) {
- var bot = node.offsetTop + node.offsetHeight;
- height = bot - prevBottom;
- prevBottom = bot;
- } else {
- var box = getRect(node);
- height = box.bottom - box.top;
- }
- var diff = node.lineObj.height - height;
- if (height < 2) height = textHeight(display);
- if (diff > .001 || diff < -.001) {
- updateLineHeight(node.lineObj, height);
- var widgets = node.lineObj.widgets;
- if (widgets) for (var i = 0; i < widgets.length; ++i)
- widgets[i].height = widgets[i].node.offsetHeight;
- }
- }
- }
-
- function updateViewOffset(cm) {
- var off = cm.display.viewOffset = heightAtLine(cm, getLine(cm.doc, cm.display.showingFrom));
- // Position the mover div to align with the current virtual scroll position
- cm.display.mover.style.top = off + "px";
- }
-
- function computeIntact(intact, changes) {
- for (var i = 0, l = changes.length || 0; i < l; ++i) {
- var change = changes[i], intact2 = [], diff = change.diff || 0;
- for (var j = 0, l2 = intact.length; j < l2; ++j) {
- var range = intact[j];
- if (change.to <= range.from && change.diff) {
- intact2.push({from: range.from + diff, to: range.to + diff});
- } else if (change.to <= range.from || change.from >= range.to) {
- intact2.push(range);
- } else {
- if (change.from > range.from)
- intact2.push({from: range.from, to: change.from});
- if (change.to < range.to)
- intact2.push({from: change.to + diff, to: range.to + diff});
- }
- }
- intact = intact2;
- }
- return intact;
- }
-
- function getDimensions(cm) {
- var d = cm.display, left = {}, width = {};
- for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
- left[cm.options.gutters[i]] = n.offsetLeft;
- width[cm.options.gutters[i]] = n.offsetWidth;
- }
- return {fixedPos: compensateForHScroll(d),
- gutterTotalWidth: d.gutters.offsetWidth,
- gutterLeft: left,
- gutterWidth: width,
- wrapperWidth: d.wrapper.clientWidth};
- }
-
- function patchDisplay(cm, from, to, intact, updateNumbersFrom) {
- var dims = getDimensions(cm);
- var display = cm.display, lineNumbers = cm.options.lineNumbers;
- if (!intact.length && (!webkit || !cm.display.currentWheelTarget))
- removeChildren(display.lineDiv);
- var container = display.lineDiv, cur = container.firstChild;
-
- function rm(node) {
- var next = node.nextSibling;
- if (webkit && mac && cm.display.currentWheelTarget == node) {
- node.style.display = "none";
- node.lineObj = null;
- } else {
- node.parentNode.removeChild(node);
- }
- return next;
- }
-
- var nextIntact = intact.shift(), lineN = from;
- cm.doc.iter(from, to, function(line) {
- if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift();
- if (lineIsHidden(cm.doc, line)) {
- if (line.height != 0) updateLineHeight(line, 0);
- if (line.widgets && cur && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) {
- var w = line.widgets[i];
- if (w.showIfHidden) {
- var prev = cur.previousSibling;
- if (/pre/i.test(prev.nodeName)) {
- var wrap = elt("div", null, null, "position: relative");
- prev.parentNode.replaceChild(wrap, prev);
- wrap.appendChild(prev);
- prev = wrap;
- }
- var wnode = prev.appendChild(elt("div", [w.node], "CodeMirror-linewidget"));
- if (!w.handleMouseEvents) wnode.ignoreEvents = true;
- positionLineWidget(w, wnode, prev, dims);
- }
- }
- } else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) {
- // This line is intact. Skip to the actual node. Update its
- // line number if needed.
- while (cur.lineObj != line) cur = rm(cur);
- if (lineNumbers && updateNumbersFrom <= lineN && cur.lineNumber)
- setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineN));
- cur = cur.nextSibling;
- } else {
- // For lines with widgets, make an attempt to find and reuse
- // the existing element, so that widgets aren't needlessly
- // removed and re-inserted into the dom
- if (line.widgets) for (var j = 0, search = cur, reuse; search && j < 20; ++j, search = search.nextSibling)
- if (search.lineObj == line && /div/i.test(search.nodeName)) { reuse = search; break; }
- // This line needs to be generated.
- var lineNode = buildLineElement(cm, line, lineN, dims, reuse);
- if (lineNode != reuse) {
- container.insertBefore(lineNode, cur);
- } else {
- while (cur != reuse) cur = rm(cur);
- cur = cur.nextSibling;
- }
-
- lineNode.lineObj = line;
- }
- ++lineN;
- });
- while (cur) cur = rm(cur);
- }
-
- function buildLineElement(cm, line, lineNo, dims, reuse) {
- var built = buildLineContent(cm, line), lineElement = built.pre;
- var markers = line.gutterMarkers, display = cm.display, wrap;
-
- var bgClass = built.bgClass ? built.bgClass + " " + (line.bgClass || "") : line.bgClass;
- if (!cm.options.lineNumbers && !markers && !bgClass && !line.wrapClass && !line.widgets)
- return lineElement;
-
- // Lines with gutter elements, widgets or a background class need
- // to be wrapped again, and have the extra elements added to the
- // wrapper div
-
- if (reuse) {
- reuse.alignable = null;
- var isOk = true, widgetsSeen = 0, insertBefore = null;
- for (var n = reuse.firstChild, next; n; n = next) {
- next = n.nextSibling;
- if (!/\bCodeMirror-linewidget\b/.test(n.className)) {
- reuse.removeChild(n);
- } else {
- for (var i = 0; i < line.widgets.length; ++i) {
- var widget = line.widgets[i];
- if (widget.node == n.firstChild) {
- if (!widget.above && !insertBefore) insertBefore = n;
- positionLineWidget(widget, n, reuse, dims);
- ++widgetsSeen;
- break;
- }
- }
- if (i == line.widgets.length) { isOk = false; break; }
- }
- }
- reuse.insertBefore(lineElement, insertBefore);
- if (isOk && widgetsSeen == line.widgets.length) {
- wrap = reuse;
- reuse.className = line.wrapClass || "";
- }
- }
- if (!wrap) {
- wrap = elt("div", null, line.wrapClass, "position: relative");
- wrap.appendChild(lineElement);
- }
- // Kludge to make sure the styled element lies behind the selection (by z-index)
- if (bgClass)
- wrap.insertBefore(elt("div", null, bgClass + " CodeMirror-linebackground"), wrap.firstChild);
- if (cm.options.lineNumbers || markers) {
- var gutterWrap = wrap.insertBefore(elt("div", null, null, "position: absolute; left: " +
- (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"),
- wrap.firstChild);
- if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap);
- if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
- wrap.lineNumber = gutterWrap.appendChild(
- elt("div", lineNumberFor(cm.options, lineNo),
- "CodeMirror-linenumber CodeMirror-gutter-elt",
- "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
- + display.lineNumInnerWidth + "px"));
- if (markers)
- for (var k = 0; k < cm.options.gutters.length; ++k) {
- var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
- if (found)
- gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
- dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
- }
- }
- if (ie_lt8) wrap.style.zIndex = 2;
- if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
- var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
- if (!widget.handleMouseEvents) node.ignoreEvents = true;
- positionLineWidget(widget, node, wrap, dims);
- if (widget.above)
- wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement);
- else
- wrap.appendChild(node);
- signalLater(widget, "redraw");
- }
- return wrap;
- }
-
- function positionLineWidget(widget, node, wrap, dims) {
- if (widget.noHScroll) {
- (wrap.alignable || (wrap.alignable = [])).push(node);
- var width = dims.wrapperWidth;
- node.style.left = dims.fixedPos + "px";
- if (!widget.coverGutter) {
- width -= dims.gutterTotalWidth;
- node.style.paddingLeft = dims.gutterTotalWidth + "px";
- }
- node.style.width = width + "px";
- }
- if (widget.coverGutter) {
- node.style.zIndex = 5;
- node.style.position = "relative";
- if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
- }
- }
-
- // SELECTION / CURSOR
-
- function updateSelection(cm) {
- var display = cm.display;
- var collapsed = posEq(cm.doc.sel.from, cm.doc.sel.to);
- if (collapsed || cm.options.showCursorWhenSelecting)
- updateSelectionCursor(cm);
- else
- display.cursor.style.display = display.otherCursor.style.display = "none";
- if (!collapsed)
- updateSelectionRange(cm);
- else
- display.selectionDiv.style.display = "none";
-
- // Move the hidden textarea near the cursor to prevent scrolling artifacts
- if (cm.options.moveInputWithCursor) {
- var headPos = cursorCoords(cm, cm.doc.sel.head, "div");
- var wrapOff = getRect(display.wrapper), lineOff = getRect(display.lineDiv);
- display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
- headPos.top + lineOff.top - wrapOff.top)) + "px";
- display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
- headPos.left + lineOff.left - wrapOff.left)) + "px";
- }
- }
-
- // No selection, plain cursor
- function updateSelectionCursor(cm) {
- var display = cm.display, pos = cursorCoords(cm, cm.doc.sel.head, "div");
- display.cursor.style.left = pos.left + "px";
- display.cursor.style.top = pos.top + "px";
- display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
- display.cursor.style.display = "";
-
- if (pos.other) {
- display.otherCursor.style.display = "";
- display.otherCursor.style.left = pos.other.left + "px";
- display.otherCursor.style.top = pos.other.top + "px";
- display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
- } else { display.otherCursor.style.display = "none"; }
- }
-
- // Highlight selection
- function updateSelectionRange(cm) {
- var display = cm.display, doc = cm.doc, sel = cm.doc.sel;
- var fragment = document.createDocumentFragment();
- var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display);
-
- function add(left, top, width, bottom) {
- if (top < 0) top = 0;
- fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
- "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) +
- "px; height: " + (bottom - top) + "px"));
- }
-
- function drawForLine(line, fromArg, toArg) {
- var lineObj = getLine(doc, line);
- var lineLen = lineObj.text.length;
- var start, end;
- function coords(ch, bias) {
- return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
- }
-
- iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
- var leftPos = coords(from, "left"), rightPos, left, right;
- if (from == to) {
- rightPos = leftPos;
- left = right = leftPos.left;
- } else {
- rightPos = coords(to - 1, "right");
- if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
- left = leftPos.left;
- right = rightPos.right;
- }
- if (fromArg == null && from == 0) left = pl;
- if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
- add(left, leftPos.top, null, leftPos.bottom);
- left = pl;
- if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
- }
- if (toArg == null && to == lineLen) right = clientWidth;
- if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
- start = leftPos;
- if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
- end = rightPos;
- if (left < pl + 1) left = pl;
- add(left, rightPos.top, right - left, rightPos.bottom);
- });
- return {start: start, end: end};
- }
-
- if (sel.from.line == sel.to.line) {
- drawForLine(sel.from.line, sel.from.ch, sel.to.ch);
- } else {
- var fromLine = getLine(doc, sel.from.line), toLine = getLine(doc, sel.to.line);
- var singleVLine = visualLine(doc, fromLine) == visualLine(doc, toLine);
- var leftEnd = drawForLine(sel.from.line, sel.from.ch, singleVLine ? fromLine.text.length : null).end;
- var rightStart = drawForLine(sel.to.line, singleVLine ? 0 : null, sel.to.ch).start;
- if (singleVLine) {
- if (leftEnd.top < rightStart.top - 2) {
- add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
- add(pl, rightStart.top, rightStart.left, rightStart.bottom);
- } else {
- add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
- }
- }
- if (leftEnd.bottom < rightStart.top)
- add(pl, leftEnd.bottom, null, rightStart.top);
- }
-
- removeChildrenAndAdd(display.selectionDiv, fragment);
- display.selectionDiv.style.display = "";
- }
-
- // Cursor-blinking
- function restartBlink(cm) {
- if (!cm.state.focused) return;
- var display = cm.display;
- clearInterval(display.blinker);
- var on = true;
- display.cursor.style.visibility = display.otherCursor.style.visibility = "";
- if (cm.options.cursorBlinkRate > 0)
- display.blinker = setInterval(function() {
- display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden";
- }, cm.options.cursorBlinkRate);
- }
-
- // HIGHLIGHT WORKER
-
- function startWorker(cm, time) {
- if (cm.doc.mode.startState && cm.doc.frontier < cm.display.showingTo)
- cm.state.highlight.set(time, bind(highlightWorker, cm));
- }
-
- function highlightWorker(cm) {
- var doc = cm.doc;
- if (doc.frontier < doc.first) doc.frontier = doc.first;
- if (doc.frontier >= cm.display.showingTo) return;
- var end = +new Date + cm.options.workTime;
- var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
- var changed = [], prevChange;
- doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.showingTo + 500), function(line) {
- if (doc.frontier >= cm.display.showingFrom) { // Visible
- var oldStyles = line.styles;
- line.styles = highlightLine(cm, line, state);
- var ischange = !oldStyles || oldStyles.length != line.styles.length;
- for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
- if (ischange) {
- if (prevChange && prevChange.end == doc.frontier) prevChange.end++;
- else changed.push(prevChange = {start: doc.frontier, end: doc.frontier + 1});
- }
- line.stateAfter = copyState(doc.mode, state);
- } else {
- processLine(cm, line, state);
- line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
- }
- ++doc.frontier;
- if (+new Date > end) {
- startWorker(cm, cm.options.workDelay);
- return true;
- }
- });
- if (changed.length)
- operation(cm, function() {
- for (var i = 0; i < changed.length; ++i)
- regChange(this, changed[i].start, changed[i].end);
- })();
- }
-
- // Finds the line to start with when starting a parse. Tries to
- // find a line with a stateAfter, so that it can start with a
- // valid state. If that fails, it returns the line with the
- // smallest indentation, which tends to need the least context to
- // parse correctly.
- function findStartLine(cm, n, precise) {
- var minindent, minline, doc = cm.doc;
- var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
- for (var search = n; search > lim; --search) {
- if (search <= doc.first) return doc.first;
- var line = getLine(doc, search - 1);
- if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
- var indented = countColumn(line.text, null, cm.options.tabSize);
- if (minline == null || minindent > indented) {
- minline = search - 1;
- minindent = indented;
- }
- }
- return minline;
- }
-
- function getStateBefore(cm, n, precise) {
- var doc = cm.doc, display = cm.display;
- if (!doc.mode.startState) return true;
- var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
- if (!state) state = startState(doc.mode);
- else state = copyState(doc.mode, state);
- doc.iter(pos, n, function(line) {
- processLine(cm, line, state);
- var save = pos == n - 1 || pos % 5 == 0 || pos >= display.showingFrom && pos < display.showingTo;
- line.stateAfter = save ? copyState(doc.mode, state) : null;
- ++pos;
- });
- if (precise) doc.frontier = pos;
- return state;
- }
-
- // POSITION MEASUREMENT
-
- function paddingTop(display) {return display.lineSpace.offsetTop;}
- function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
- function paddingLeft(display) {
- var e = removeChildrenAndAdd(display.measure, elt("pre", null, null, "text-align: left")).appendChild(elt("span", "x"));
- return e.offsetLeft;
- }
-
- function measureChar(cm, line, ch, data, bias) {
- var dir = -1;
- data = data || measureLine(cm, line);
- if (data.crude) {
- var left = data.left + ch * data.width;
- return {left: left, right: left + data.width, top: data.top, bottom: data.bottom};
- }
-
- for (var pos = ch;; pos += dir) {
- var r = data[pos];
- if (r) break;
- if (dir < 0 && pos == 0) dir = 1;
- }
- bias = pos > ch ? "left" : pos < ch ? "right" : bias;
- if (bias == "left" && r.leftSide) r = r.leftSide;
- else if (bias == "right" && r.rightSide) r = r.rightSide;
- return {left: pos < ch ? r.right : r.left,
- right: pos > ch ? r.left : r.right,
- top: r.top,
- bottom: r.bottom};
- }
-
- function findCachedMeasurement(cm, line) {
- var cache = cm.display.measureLineCache;
- for (var i = 0; i < cache.length; ++i) {
- var memo = cache[i];
- if (memo.text == line.text && memo.markedSpans == line.markedSpans &&
- cm.display.scroller.clientWidth == memo.width &&
- memo.classes == line.textClass + "|" + line.wrapClass)
- return memo;
- }
- }
-
- function clearCachedMeasurement(cm, line) {
- var exists = findCachedMeasurement(cm, line);
- if (exists) exists.text = exists.measure = exists.markedSpans = null;
- }
-
- function measureLine(cm, line) {
- // First look in the cache
- var cached = findCachedMeasurement(cm, line);
- if (cached) return cached.measure;
-
- // Failing that, recompute and store result in cache
- var measure = measureLineInner(cm, line);
- var cache = cm.display.measureLineCache;
- var memo = {text: line.text, width: cm.display.scroller.clientWidth,
- markedSpans: line.markedSpans, measure: measure,
- classes: line.textClass + "|" + line.wrapClass};
- if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo;
- else cache.push(memo);
- return measure;
- }
-
- function measureLineInner(cm, line) {
- if (!cm.options.lineWrapping && line.text.length >= cm.options.crudeMeasuringFrom)
- return crudelyMeasureLine(cm, line);
-
- var display = cm.display, measure = emptyArray(line.text.length);
- var pre = buildLineContent(cm, line, measure, true).pre;
-
- // IE does not cache element positions of inline elements between
- // calls to getBoundingClientRect. This makes the loop below,
- // which gathers the positions of all the characters on the line,
- // do an amount of layout work quadratic to the number of
- // characters. When line wrapping is off, we try to improve things
- // by first subdividing the line into a bunch of inline blocks, so
- // that IE can reuse most of the layout information from caches
- // for those blocks. This does interfere with line wrapping, so it
- // doesn't work when wrapping is on, but in that case the
- // situation is slightly better, since IE does cache line-wrapping
- // information and only recomputes per-line.
- if (ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) {
- var fragment = document.createDocumentFragment();
- var chunk = 10, n = pre.childNodes.length;
- for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) {
- var wrap = elt("div", null, null, "display: inline-block");
- for (var j = 0; j < chunk && n; ++j) {
- wrap.appendChild(pre.firstChild);
- --n;
- }
- fragment.appendChild(wrap);
- }
- pre.appendChild(fragment);
- }
-
- removeChildrenAndAdd(display.measure, pre);
-
- var outer = getRect(display.lineDiv);
- var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight;
- // Work around an IE7/8 bug where it will sometimes have randomly
- // replaced our pre with a clone at this point.
- if (ie_lt9 && display.measure.first != pre)
- removeChildrenAndAdd(display.measure, pre);
-
- function measureRect(rect) {
- var top = rect.top - outer.top, bot = rect.bottom - outer.top;
- if (bot > maxBot) bot = maxBot;
- if (top < 0) top = 0;
- for (var i = vranges.length - 2; i >= 0; i -= 2) {
- var rtop = vranges[i], rbot = vranges[i+1];
- if (rtop > bot || rbot < top) continue;
- if (rtop <= top && rbot >= bot ||
- top <= rtop && bot >= rbot ||
- Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) {
- vranges[i] = Math.min(top, rtop);
- vranges[i+1] = Math.max(bot, rbot);
- break;
- }
- }
- if (i < 0) { i = vranges.length; vranges.push(top, bot); }
- return {left: rect.left - outer.left,
- right: rect.right - outer.left,
- top: i, bottom: null};
- }
- function finishRect(rect) {
- rect.bottom = vranges[rect.top+1];
- rect.top = vranges[rect.top];
- }
-
- for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) {
- var node = cur, rect = null;
- // A widget might wrap, needs special care
- if (/\bCodeMirror-widget\b/.test(cur.className) && cur.getClientRects) {
- if (cur.firstChild.nodeType == 1) node = cur.firstChild;
- var rects = node.getClientRects();
- if (rects.length > 1) {
- rect = data[i] = measureRect(rects[0]);
- rect.rightSide = measureRect(rects[rects.length - 1]);
- }
- }
- if (!rect) rect = data[i] = measureRect(getRect(node));
- if (cur.measureRight) rect.right = getRect(cur.measureRight).left;
- if (cur.leftSide) rect.leftSide = measureRect(getRect(cur.leftSide));
- }
- removeChildren(cm.display.measure);
- for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) {
- finishRect(cur);
- if (cur.leftSide) finishRect(cur.leftSide);
- if (cur.rightSide) finishRect(cur.rightSide);
- }
- return data;
- }
-
- function crudelyMeasureLine(cm, line) {
- var copy = new Line(line.text.slice(0, 100), null);
- if (line.textClass) copy.textClass = line.textClass;
- var measure = measureLineInner(cm, copy);
- var left = measureChar(cm, copy, 0, measure, "left");
- var right = measureChar(cm, copy, 99, measure, "right");
- return {crude: true, top: left.top, left: left.left, bottom: left.bottom, width: (right.right - left.left) / 100};
- }
-
- function measureLineWidth(cm, line) {
- var hasBadSpan = false;
- if (line.markedSpans) for (var i = 0; i < line.markedSpans; ++i) {
- var sp = line.markedSpans[i];
- if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true;
- }
- var cached = !hasBadSpan && findCachedMeasurement(cm, line);
- if (cached || line.text.length >= cm.options.crudeMeasuringFrom)
- return measureChar(cm, line, line.text.length, cached && cached.measure, "right").right;
-
- var pre = buildLineContent(cm, line, null, true).pre;
- var end = pre.appendChild(zeroWidthElement(cm.display.measure));
- removeChildrenAndAdd(cm.display.measure, pre);
- return getRect(end).right - getRect(cm.display.lineDiv).left;
- }
-
- function clearCaches(cm) {
- cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0;
- cm.display.cachedCharWidth = cm.display.cachedTextHeight = null;
- if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
- cm.display.lineNumChars = null;
- }
-
- function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
- function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
-
- // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page"
- function intoCoordSystem(cm, lineObj, rect, context) {
- if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
- var size = widgetHeight(lineObj.widgets[i]);
- rect.top += size; rect.bottom += size;
- }
- if (context == "line") return rect;
- if (!context) context = "local";
- var yOff = heightAtLine(cm, lineObj);
- if (context == "local") yOff += paddingTop(cm.display);
- else yOff -= cm.display.viewOffset;
- if (context == "page" || context == "window") {
- var lOff = getRect(cm.display.lineSpace);
- yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
- var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
- rect.left += xOff; rect.right += xOff;
- }
- rect.top += yOff; rect.bottom += yOff;
- return rect;
- }
-
- // Context may be "window", "page", "div", or "local"/null
- // Result is in "div" coords
- function fromCoordSystem(cm, coords, context) {
- if (context == "div") return coords;
- var left = coords.left, top = coords.top;
- // First move into "page" coordinate system
- if (context == "page") {
- left -= pageScrollX();
- top -= pageScrollY();
- } else if (context == "local" || !context) {
- var localBox = getRect(cm.display.sizer);
- left += localBox.left;
- top += localBox.top;
- }
-
- var lineSpaceBox = getRect(cm.display.lineSpace);
- return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
- }
-
- function charCoords(cm, pos, context, lineObj, bias) {
- if (!lineObj) lineObj = getLine(cm.doc, pos.line);
- return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, null, bias), context);
- }
-
- function cursorCoords(cm, pos, context, lineObj, measurement) {
- lineObj = lineObj || getLine(cm.doc, pos.line);
- if (!measurement) measurement = measureLine(cm, lineObj);
- function get(ch, right) {
- var m = measureChar(cm, lineObj, ch, measurement, right ? "right" : "left");
- if (right) m.left = m.right; else m.right = m.left;
- return intoCoordSystem(cm, lineObj, m, context);
- }
- function getBidi(ch, partPos) {
- var part = order[partPos], right = part.level % 2;
- if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
- part = order[--partPos];
- ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
- right = true;
- } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
- part = order[++partPos];
- ch = bidiLeft(part) - part.level % 2;
- right = false;
- }
- if (right && ch == part.to && ch > part.from) return get(ch - 1);
- return get(ch, right);
- }
- var order = getOrder(lineObj), ch = pos.ch;
- if (!order) return get(ch);
- var partPos = getBidiPartAt(order, ch);
- var val = getBidi(ch, partPos);
- if (bidiOther != null) val.other = getBidi(ch, bidiOther);
- return val;
- }
-
- function PosWithInfo(line, ch, outside, xRel) {
- var pos = new Pos(line, ch);
- pos.xRel = xRel;
- if (outside) pos.outside = true;
- return pos;
- }
-
- // Coords must be lineSpace-local
- function coordsChar(cm, x, y) {
- var doc = cm.doc;
- y += cm.display.viewOffset;
- if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
- var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
- if (lineNo > last)
- return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
- if (x < 0) x = 0;
-
- for (;;) {
- var lineObj = getLine(doc, lineNo);
- var found = coordsCharInner(cm, lineObj, lineNo, x, y);
- var merged = collapsedSpanAtEnd(lineObj);
- var mergedPos = merged && merged.find();
- if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
- lineNo = mergedPos.to.line;
- else
- return found;
- }
- }
-
- function coordsCharInner(cm, lineObj, lineNo, x, y) {
- var innerOff = y - heightAtLine(cm, lineObj);
- var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
- var measurement = measureLine(cm, lineObj);
-
- function getX(ch) {
- var sp = cursorCoords(cm, Pos(lineNo, ch), "line",
- lineObj, measurement);
- wrongLine = true;
- if (innerOff > sp.bottom) return sp.left - adjust;
- else if (innerOff < sp.top) return sp.left + adjust;
- else wrongLine = false;
- return sp.left;
- }
-
- var bidi = getOrder(lineObj), dist = lineObj.text.length;
- var from = lineLeft(lineObj), to = lineRight(lineObj);
- var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
-
- if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
- // Do a binary search between these bounds.
- for (;;) {
- if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
- var ch = x < fromX || x - fromX <= toX - x ? from : to;
- var xDiff = x - (ch == from ? fromX : toX);
- while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch;
- var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
- xDiff < 0 ? -1 : xDiff ? 1 : 0);
- return pos;
- }
- var step = Math.ceil(dist / 2), middle = from + step;
- if (bidi) {
- middle = from;
- for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
- }
- var middleX = getX(middle);
- if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
- else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
- }
- }
-
- var measureText;
- function textHeight(display) {
- if (display.cachedTextHeight != null) return display.cachedTextHeight;
- if (measureText == null) {
- measureText = elt("pre");
- // Measure a bunch of lines, for browsers that compute
- // fractional heights.
- for (var i = 0; i < 49; ++i) {
- measureText.appendChild(document.createTextNode("x"));
- measureText.appendChild(elt("br"));
- }
- measureText.appendChild(document.createTextNode("x"));
- }
- removeChildrenAndAdd(display.measure, measureText);
- var height = measureText.offsetHeight / 50;
- if (height > 3) display.cachedTextHeight = height;
- removeChildren(display.measure);
- return height || 1;
- }
-
- function charWidth(display) {
- if (display.cachedCharWidth != null) return display.cachedCharWidth;
- var anchor = elt("span", "x");
- var pre = elt("pre", [anchor]);
- removeChildrenAndAdd(display.measure, pre);
- var width = anchor.offsetWidth;
- if (width > 2) display.cachedCharWidth = width;
- return width || 10;
- }
-
- // OPERATIONS
-
- // Operations are used to wrap changes in such a way that each
- // change won't have to update the cursor and display (which would
- // be awkward, slow, and error-prone), but instead updates are
- // batched and then all combined and executed at once.
-
- var nextOpId = 0;
- function startOperation(cm) {
- cm.curOp = {
- // An array of ranges of lines that have to be updated. See
- // updateDisplay.
- changes: [],
- forceUpdate: false,
- updateInput: null,
- userSelChange: null,
- textChanged: null,
- selectionChanged: false,
- cursorActivity: false,
- updateMaxLine: false,
- updateScrollPos: false,
- id: ++nextOpId
- };
- if (!delayedCallbackDepth++) delayedCallbacks = [];
- }
-
- function endOperation(cm) {
- var op = cm.curOp, doc = cm.doc, display = cm.display;
- cm.curOp = null;
-
- if (op.updateMaxLine) computeMaxLength(cm);
- if (display.maxLineChanged && !cm.options.lineWrapping && display.maxLine) {
- var width = measureLineWidth(cm, display.maxLine);
- display.sizer.style.minWidth = Math.max(0, width + 3 + scrollerCutOff) + "px";
- display.maxLineChanged = false;
- var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth);
- if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos)
- setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true);
- }
- var newScrollPos, updated;
- if (op.updateScrollPos) {
- newScrollPos = op.updateScrollPos;
- } else if (op.selectionChanged && display.scroller.clientHeight) { // don't rescroll if not visible
- var coords = cursorCoords(cm, doc.sel.head);
- newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom);
- }
- if (op.changes.length || op.forceUpdate || newScrollPos && newScrollPos.scrollTop != null) {
- updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop, op.forceUpdate);
- if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop;
- }
- if (!updated && op.selectionChanged) updateSelection(cm);
- if (op.updateScrollPos) {
- display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = newScrollPos.scrollTop;
- display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = newScrollPos.scrollLeft;
- alignHorizontally(cm);
- if (op.scrollToPos)
- scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos.from),
- clipPos(cm.doc, op.scrollToPos.to), op.scrollToPos.margin);
- } else if (newScrollPos) {
- scrollCursorIntoView(cm);
- }
- if (op.selectionChanged) restartBlink(cm);
-
- if (cm.state.focused && op.updateInput)
- resetInput(cm, op.userSelChange);
-
- var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
- if (hidden) for (var i = 0; i < hidden.length; ++i)
- if (!hidden[i].lines.length) signal(hidden[i], "hide");
- if (unhidden) for (var i = 0; i < unhidden.length; ++i)
- if (unhidden[i].lines.length) signal(unhidden[i], "unhide");
-
- var delayed;
- if (!--delayedCallbackDepth) {
- delayed = delayedCallbacks;
- delayedCallbacks = null;
- }
- if (op.textChanged)
- signal(cm, "change", cm, op.textChanged);
- if (op.cursorActivity) signal(cm, "cursorActivity", cm);
- if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();
- }
-
- // Wraps a function in an operation. Returns the wrapped function.
- function operation(cm1, f) {
- return function() {
- var cm = cm1 || this, withOp = !cm.curOp;
- if (withOp) startOperation(cm);
- try { var result = f.apply(cm, arguments); }
- finally { if (withOp) endOperation(cm); }
- return result;
- };
- }
- function docOperation(f) {
- return function() {
- var withOp = this.cm && !this.cm.curOp, result;
- if (withOp) startOperation(this.cm);
- try { result = f.apply(this, arguments); }
- finally { if (withOp) endOperation(this.cm); }
- return result;
- };
- }
- function runInOp(cm, f) {
- var withOp = !cm.curOp, result;
- if (withOp) startOperation(cm);
- try { result = f(); }
- finally { if (withOp) endOperation(cm); }
- return result;
- }
-
- function regChange(cm, from, to, lendiff) {
- if (from == null) from = cm.doc.first;
- if (to == null) to = cm.doc.first + cm.doc.size;
- cm.curOp.changes.push({from: from, to: to, diff: lendiff});
- }
-
- // INPUT HANDLING
-
- function slowPoll(cm) {
- if (cm.display.pollingFast) return;
- cm.display.poll.set(cm.options.pollInterval, function() {
- readInput(cm);
- if (cm.state.focused) slowPoll(cm);
- });
- }
-
- function fastPoll(cm) {
- var missed = false;
- cm.display.pollingFast = true;
- function p() {
- var changed = readInput(cm);
- if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}
- else {cm.display.pollingFast = false; slowPoll(cm);}
- }
- cm.display.poll.set(20, p);
- }
-
- // prevInput is a hack to work with IME. If we reset the textarea
- // on every change, that breaks IME. So we look for changes
- // compared to the previous content instead. (Modern browsers have
- // events that indicate IME taking place, but these are not widely
- // supported or compatible enough yet to rely on.)
- function readInput(cm) {
- var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel;
- if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.state.disableInput) return false;
- if (cm.state.pasteIncoming && cm.state.fakedLastChar) {
- input.value = input.value.substring(0, input.value.length - 1);
- cm.state.fakedLastChar = false;
- }
- var text = input.value;
- if (text == prevInput && posEq(sel.from, sel.to)) return false;
- if (ie && !ie_lt9 && cm.display.inputHasSelection === text) {
- resetInput(cm, true);
- return false;
- }
-
- var withOp = !cm.curOp;
- if (withOp) startOperation(cm);
- sel.shift = false;
- var same = 0, l = Math.min(prevInput.length, text.length);
- while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
- var from = sel.from, to = sel.to;
- if (same < prevInput.length)
- from = Pos(from.line, from.ch - (prevInput.length - same));
- else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming)
- to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + (text.length - same)));
-
- var updateInput = cm.curOp.updateInput;
- var changeEvent = {from: from, to: to, text: splitLines(text.slice(same)),
- origin: cm.state.pasteIncoming ? "paste" : "+input"};
- makeChange(cm.doc, changeEvent, "end");
- cm.curOp.updateInput = updateInput;
- signalLater(cm, "inputRead", cm, changeEvent);
-
- if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";
- else cm.display.prevInput = text;
- if (withOp) endOperation(cm);
- cm.state.pasteIncoming = false;
- return true;
- }
-
- function resetInput(cm, user) {
- var minimal, selected, doc = cm.doc;
- if (!posEq(doc.sel.from, doc.sel.to)) {
- cm.display.prevInput = "";
- minimal = hasCopyEvent &&
- (doc.sel.to.line - doc.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000);
- var content = minimal ? "-" : selected || cm.getSelection();
- cm.display.input.value = content;
- if (cm.state.focused) selectInput(cm.display.input);
- if (ie && !ie_lt9) cm.display.inputHasSelection = content;
- } else if (user) {
- cm.display.prevInput = cm.display.input.value = "";
- if (ie && !ie_lt9) cm.display.inputHasSelection = null;
- }
- cm.display.inaccurateSelection = minimal;
- }
-
- function focusInput(cm) {
- if (cm.options.readOnly != "nocursor" && (!mobile || document.activeElement != cm.display.input))
- cm.display.input.focus();
- }
-
- function isReadOnly(cm) {
- return cm.options.readOnly || cm.doc.cantEdit;
- }
-
- // EVENT HANDLERS
-
- function registerEventHandlers(cm) {
- var d = cm.display;
- on(d.scroller, "mousedown", operation(cm, onMouseDown));
- if (ie)
- on(d.scroller, "dblclick", operation(cm, function(e) {
- if (signalDOMEvent(cm, e)) return;
- var pos = posFromMouse(cm, e);
- if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
- e_preventDefault(e);
- var word = findWordAt(getLine(cm.doc, pos.line).text, pos);
- extendSelection(cm.doc, word.from, word.to);
- }));
- else
- on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
- on(d.lineSpace, "selectstart", function(e) {
- if (!eventInWidget(d, e)) e_preventDefault(e);
- });
- // Gecko browsers fire contextmenu *after* opening the menu, at
- // which point we can't mess with it anymore. Context menu is
- // handled in onMouseDown for Gecko.
- if (!captureMiddleClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});
-
- on(d.scroller, "scroll", function() {
- if (d.scroller.clientHeight) {
- setScrollTop(cm, d.scroller.scrollTop);
- setScrollLeft(cm, d.scroller.scrollLeft, true);
- signal(cm, "scroll", cm);
- }
- });
- on(d.scrollbarV, "scroll", function() {
- if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop);
- });
- on(d.scrollbarH, "scroll", function() {
- if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft);
- });
-
- on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
- on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});
-
- function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); }
- on(d.scrollbarH, "mousedown", reFocus);
- on(d.scrollbarV, "mousedown", reFocus);
- // Prevent wrapper from ever scrolling
- on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
-
- var resizeTimer;
- function onResize() {
- if (resizeTimer == null) resizeTimer = setTimeout(function() {
- resizeTimer = null;
- // Might be a text scaling operation, clear size caches.
- d.cachedCharWidth = d.cachedTextHeight = knownScrollbarWidth = null;
- clearCaches(cm);
- runInOp(cm, bind(regChange, cm));
- }, 100);
- }
- on(window, "resize", onResize);
- // Above handler holds on to the editor and its data structures.
- // Here we poll to unregister it when the editor is no longer in
- // the document, so that it can be garbage-collected.
- function unregister() {
- for (var p = d.wrapper.parentNode; p && p != document.body; p = p.parentNode) {}
- if (p) setTimeout(unregister, 5000);
- else off(window, "resize", onResize);
- }
- setTimeout(unregister, 5000);
-
- on(d.input, "keyup", operation(cm, function(e) {
- if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
- if (e.keyCode == 16) cm.doc.sel.shift = false;
- }));
- on(d.input, "input", function() {
- if (ie && !ie_lt9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;
- fastPoll(cm);
- });
- on(d.input, "keydown", operation(cm, onKeyDown));
- on(d.input, "keypress", operation(cm, onKeyPress));
- on(d.input, "focus", bind(onFocus, cm));
- on(d.input, "blur", bind(onBlur, cm));
-
- function drag_(e) {
- if (signalDOMEvent(cm, e) || cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return;
- e_stop(e);
- }
- if (cm.options.dragDrop) {
- on(d.scroller, "dragstart", function(e){onDragStart(cm, e);});
- on(d.scroller, "dragenter", drag_);
- on(d.scroller, "dragover", drag_);
- on(d.scroller, "drop", operation(cm, onDrop));
- }
- on(d.scroller, "paste", function(e) {
- if (eventInWidget(d, e)) return;
- focusInput(cm);
- fastPoll(cm);
- });
- on(d.input, "paste", function() {
- // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206
- // Add a char to the end of textarea before paste occur so that
- // selection doesn't span to the end of textarea.
- if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {
- var start = d.input.selectionStart, end = d.input.selectionEnd;
- d.input.value += "$";
- d.input.selectionStart = start;
- d.input.selectionEnd = end;
- cm.state.fakedLastChar = true;
- }
- cm.state.pasteIncoming = true;
- fastPoll(cm);
- });
-
- function prepareCopy() {
- if (d.inaccurateSelection) {
- d.prevInput = "";
- d.inaccurateSelection = false;
- d.input.value = cm.getSelection();
- selectInput(d.input);
- }
- }
- on(d.input, "cut", prepareCopy);
- on(d.input, "copy", prepareCopy);
-
- // Needed to handle Tab key in KHTML
- if (khtml) on(d.sizer, "mouseup", function() {
- if (document.activeElement == d.input) d.input.blur();
- focusInput(cm);
- });
- }
-
- function eventInWidget(display, e) {
- for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
- if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;
- }
- }
-
- function posFromMouse(cm, e, liberal) {
- var display = cm.display;
- if (!liberal) {
- var target = e_target(e);
- if (target == display.scrollbarH || target == display.scrollbarH.firstChild ||
- target == display.scrollbarV || target == display.scrollbarV.firstChild ||
- target == display.scrollbarFiller || target == display.gutterFiller) return null;
- }
- var x, y, space = getRect(display.lineSpace);
- // Fails unpredictably on IE[67] when mouse is dragged around quickly.
- try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
- return coordsChar(cm, x - space.left, y - space.top);
- }
-
- var lastClick, lastDoubleClick;
- function onMouseDown(e) {
- if (signalDOMEvent(this, e)) return;
- var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel;
- sel.shift = e.shiftKey;
-
- if (eventInWidget(display, e)) {
- if (!webkit) {
- display.scroller.draggable = false;
- setTimeout(function(){display.scroller.draggable = true;}, 100);
- }
- return;
- }
- if (clickInGutter(cm, e)) return;
- var start = posFromMouse(cm, e);
-
- switch (e_button(e)) {
- case 3:
- if (captureMiddleClick) onContextMenu.call(cm, cm, e);
- return;
- case 2:
- if (webkit) cm.state.lastMiddleDown = +new Date;
- if (start) extendSelection(cm.doc, start);
- setTimeout(bind(focusInput, cm), 20);
- e_preventDefault(e);
- return;
- }
- // For button 1, if it was clicked inside the editor
- // (posFromMouse returning non-null), we have to adjust the
- // selection.
- if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;}
-
- if (!cm.state.focused) onFocus(cm);
-
- var now = +new Date, type = "single";
- if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
- type = "triple";
- e_preventDefault(e);
- setTimeout(bind(focusInput, cm), 20);
- selectLine(cm, start.line);
- } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
- type = "double";
- lastDoubleClick = {time: now, pos: start};
- e_preventDefault(e);
- var word = findWordAt(getLine(doc, start.line).text, start);
- extendSelection(cm.doc, word.from, word.to);
- } else { lastClick = {time: now, pos: start}; }
-
- var last = start;
- if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) &&
- !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") {
- var dragEnd = operation(cm, function(e2) {
- if (webkit) display.scroller.draggable = false;
- cm.state.draggingText = false;
- off(document, "mouseup", dragEnd);
- off(display.scroller, "drop", dragEnd);
- if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
- e_preventDefault(e2);
- extendSelection(cm.doc, start);
- focusInput(cm);
- }
- });
- // Let the drag handler handle this.
- if (webkit) display.scroller.draggable = true;
- cm.state.draggingText = dragEnd;
- // IE's approach to draggable
- if (display.scroller.dragDrop) display.scroller.dragDrop();
- on(document, "mouseup", dragEnd);
- on(display.scroller, "drop", dragEnd);
- return;
- }
- e_preventDefault(e);
- if (type == "single") extendSelection(cm.doc, clipPos(doc, start));
-
- var startstart = sel.from, startend = sel.to, lastPos = start;
-
- function doSelect(cur) {
- if (posEq(lastPos, cur)) return;
- lastPos = cur;
-
- if (type == "single") {
- extendSelection(cm.doc, clipPos(doc, start), cur);
- return;
- }
-
- startstart = clipPos(doc, startstart);
- startend = clipPos(doc, startend);
- if (type == "double") {
- var word = findWordAt(getLine(doc, cur.line).text, cur);
- if (posLess(cur, startstart)) extendSelection(cm.doc, word.from, startend);
- else extendSelection(cm.doc, startstart, word.to);
- } else if (type == "triple") {
- if (posLess(cur, startstart)) extendSelection(cm.doc, startend, clipPos(doc, Pos(cur.line, 0)));
- else extendSelection(cm.doc, startstart, clipPos(doc, Pos(cur.line + 1, 0)));
- }
- }
-
- var editorSize = getRect(display.wrapper);
- // Used to ensure timeout re-tries don't fire when another extend
- // happened in the meantime (clearTimeout isn't reliable -- at
- // least on Chrome, the timeouts still happen even when cleared,
- // if the clear happens after their scheduled firing time).
- var counter = 0;
-
- function extend(e) {
- var curCount = ++counter;
- var cur = posFromMouse(cm, e, true);
- if (!cur) return;
- if (!posEq(cur, last)) {
- if (!cm.state.focused) onFocus(cm);
- last = cur;
- doSelect(cur);
- var visible = visibleLines(display, doc);
- if (cur.line >= visible.to || cur.line < visible.from)
- setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
- } else {
- var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
- if (outside) setTimeout(operation(cm, function() {
- if (counter != curCount) return;
- display.scroller.scrollTop += outside;
- extend(e);
- }), 50);
- }
- }
-
- function done(e) {
- counter = Infinity;
- e_preventDefault(e);
- focusInput(cm);
- off(document, "mousemove", move);
- off(document, "mouseup", up);
- }
-
- var move = operation(cm, function(e) {
- if (!ie && !e_button(e)) done(e);
- else extend(e);
- });
- var up = operation(cm, done);
- on(document, "mousemove", move);
- on(document, "mouseup", up);
- }
-
- function gutterEvent(cm, e, type, prevent, signalfn) {
- try { var mX = e.clientX, mY = e.clientY; }
- catch(e) { return false; }
- if (mX >= Math.floor(getRect(cm.display.gutters).right)) return false;
- if (prevent) e_preventDefault(e);
-
- var display = cm.display;
- var lineBox = getRect(display.lineDiv);
-
- if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);
- mY -= lineBox.top - display.viewOffset;
-
- for (var i = 0; i < cm.options.gutters.length; ++i) {
- var g = display.gutters.childNodes[i];
- if (g && getRect(g).right >= mX) {
- var line = lineAtHeight(cm.doc, mY);
- var gutter = cm.options.gutters[i];
- signalfn(cm, type, cm, line, gutter, e);
- return e_defaultPrevented(e);
- }
- }
- }
-
- function contextMenuInGutter(cm, e) {
- if (!hasHandler(cm, "gutterContextMenu")) return false;
- return gutterEvent(cm, e, "gutterContextMenu", false, signal);
- }
-
- function clickInGutter(cm, e) {
- return gutterEvent(cm, e, "gutterClick", true, signalLater);
- }
-
- // Kludge to work around strange IE behavior where it'll sometimes
- // re-fire a series of drag-related events right after the drop (#1551)
- var lastDrop = 0;
-
- function onDrop(e) {
- var cm = this;
- if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))))
- return;
- e_preventDefault(e);
- if (ie) lastDrop = +new Date;
- var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
- if (!pos || isReadOnly(cm)) return;
- if (files && files.length && window.FileReader && window.File) {
- var n = files.length, text = Array(n), read = 0;
- var loadFile = function(file, i) {
- var reader = new FileReader;
- reader.onload = function() {
- text[i] = reader.result;
- if (++read == n) {
- pos = clipPos(cm.doc, pos);
- makeChange(cm.doc, {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"}, "around");
- }
- };
- reader.readAsText(file);
- };
- for (var i = 0; i < n; ++i) loadFile(files[i], i);
- } else {
- // Don't do a replace if the drop happened inside of the selected text.
- if (cm.state.draggingText && !(posLess(pos, cm.doc.sel.from) || posLess(cm.doc.sel.to, pos))) {
- cm.state.draggingText(e);
- // Ensure the editor is re-focused
- setTimeout(bind(focusInput, cm), 20);
- return;
- }
- try {
- var text = e.dataTransfer.getData("Text");
- if (text) {
- var curFrom = cm.doc.sel.from, curTo = cm.doc.sel.to;
- setSelection(cm.doc, pos, pos);
- if (cm.state.draggingText) replaceRange(cm.doc, "", curFrom, curTo, "paste");
- cm.replaceSelection(text, null, "paste");
- focusInput(cm);
- onFocus(cm);
- }
- }
- catch(e){}
- }
- }
-
- function onDragStart(cm, e) {
- if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
- if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
-
- var txt = cm.getSelection();
- e.dataTransfer.setData("Text", txt);
-
- // Use dummy image instead of default browsers image.
- // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
- if (e.dataTransfer.setDragImage && !safari) {
- var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
- img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
- if (opera) {
- img.width = img.height = 1;
- cm.display.wrapper.appendChild(img);
- // Force a relayout, or Opera won't use our image for some obscure reason
- img._top = img.offsetTop;
- }
- e.dataTransfer.setDragImage(img, 0, 0);
- if (opera) img.parentNode.removeChild(img);
- }
- }
-
- function setScrollTop(cm, val) {
- if (Math.abs(cm.doc.scrollTop - val) < 2) return;
- cm.doc.scrollTop = val;
- if (!gecko) updateDisplay(cm, [], val);
- if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
- if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;
- if (gecko) updateDisplay(cm, []);
- startWorker(cm, 100);
- }
- function setScrollLeft(cm, val, isScroller) {
- if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
- val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
- cm.doc.scrollLeft = val;
- alignHorizontally(cm);
- if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
- if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val;
- }
-
- // Since the delta values reported on mouse wheel events are
- // unstandardized between browsers and even browser versions, and
- // generally horribly unpredictable, this code starts by measuring
- // the scroll effect that the first few mouse wheel events have,
- // and, from that, detects the way it can convert deltas to pixel
- // offsets afterwards.
- //
- // The reason we want to know the amount a wheel event will scroll
- // is that it gives us a chance to update the display before the
- // actual scrolling happens, reducing flickering.
-
- var wheelSamples = 0, wheelPixelsPerUnit = null;
- // Fill in a browser-detected starting value on browsers where we
- // know one. These don't have to be accurate -- the result of them
- // being wrong would just be a slight flicker on the first wheel
- // scroll (if it is large enough).
- if (ie) wheelPixelsPerUnit = -.53;
- else if (gecko) wheelPixelsPerUnit = 15;
- else if (chrome) wheelPixelsPerUnit = -.7;
- else if (safari) wheelPixelsPerUnit = -1/3;
-
- function onScrollWheel(cm, e) {
- var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
- if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
- if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
- else if (dy == null) dy = e.wheelDelta;
-
- var display = cm.display, scroll = display.scroller;
- // Quit if there's nothing to scroll here
- if (!(dx && scroll.scrollWidth > scroll.clientWidth ||
- dy && scroll.scrollHeight > scroll.clientHeight)) return;
-
- // Webkit browsers on OS X abort momentum scrolls when the target
- // of the scroll event is removed from the scrollable element.
- // This hack (see related code in patchDisplay) makes sure the
- // element is kept around.
- if (dy && mac && webkit) {
- for (var cur = e.target; cur != scroll; cur = cur.parentNode) {
- if (cur.lineObj) {
- cm.display.currentWheelTarget = cur;
- break;
- }
- }
- }
-
- // On some browsers, horizontal scrolling will cause redraws to
- // happen before the gutter has been realigned, causing it to
- // wriggle around in a most unseemly way. When we have an
- // estimated pixels/delta value, we just handle horizontal
- // scrolling entirely here. It'll be slightly off from native, but
- // better than glitching out.
- if (dx && !gecko && !opera && wheelPixelsPerUnit != null) {
- if (dy)
- setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
- setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
- e_preventDefault(e);
- display.wheelStartX = null; // Abort measurement, if in progress
- return;
- }
-
- if (dy && wheelPixelsPerUnit != null) {
- var pixels = dy * wheelPixelsPerUnit;
- var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
- if (pixels < 0) top = Math.max(0, top + pixels - 50);
- else bot = Math.min(cm.doc.height, bot + pixels + 50);
- updateDisplay(cm, [], {top: top, bottom: bot});
- }
-
- if (wheelSamples < 20) {
- if (display.wheelStartX == null) {
- display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
- display.wheelDX = dx; display.wheelDY = dy;
- setTimeout(function() {
- if (display.wheelStartX == null) return;
- var movedX = scroll.scrollLeft - display.wheelStartX;
- var movedY = scroll.scrollTop - display.wheelStartY;
- var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
- (movedX && display.wheelDX && movedX / display.wheelDX);
- display.wheelStartX = display.wheelStartY = null;
- if (!sample) return;
- wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
- ++wheelSamples;
- }, 200);
- } else {
- display.wheelDX += dx; display.wheelDY += dy;
- }
- }
- }
-
- function doHandleBinding(cm, bound, dropShift) {
- if (typeof bound == "string") {
- bound = commands[bound];
- if (!bound) return false;
- }
- // Ensure previous input has been read, so that the handler sees a
- // consistent view of the document
- if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;
- var doc = cm.doc, prevShift = doc.sel.shift, done = false;
- try {
- if (isReadOnly(cm)) cm.state.suppressEdits = true;
- if (dropShift) doc.sel.shift = false;
- done = bound(cm) != Pass;
- } finally {
- doc.sel.shift = prevShift;
- cm.state.suppressEdits = false;
- }
- return done;
- }
-
- function allKeyMaps(cm) {
- var maps = cm.state.keyMaps.slice(0);
- if (cm.options.extraKeys) maps.push(cm.options.extraKeys);
- maps.push(cm.options.keyMap);
- return maps;
- }
-
- var maybeTransition;
- function handleKeyBinding(cm, e) {
- // Handle auto keymap transitions
- var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;
- clearTimeout(maybeTransition);
- if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
- if (getKeyMap(cm.options.keyMap) == startMap) {
- cm.options.keyMap = (next.call ? next.call(null, cm) : next);
- keyMapChanged(cm);
- }
- }, 50);
-
- var name = keyName(e, true), handled = false;
- if (!name) return false;
- var keymaps = allKeyMaps(cm);
-
- if (e.shiftKey) {
- // First try to resolve full name (including 'Shift-'). Failing
- // that, see if there is a cursor-motion command (starting with
- // 'go') bound to the keyname without 'Shift-'.
- handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})
- || lookupKey(name, keymaps, function(b) {
- if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
- return doHandleBinding(cm, b);
- });
- } else {
- handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });
- }
-
- if (handled) {
- e_preventDefault(e);
- restartBlink(cm);
- if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
- signalLater(cm, "keyHandled", cm, name, e);
- }
- return handled;
- }
-
- function handleCharBinding(cm, e, ch) {
- var handled = lookupKey("'" + ch + "'", allKeyMaps(cm),
- function(b) { return doHandleBinding(cm, b, true); });
- if (handled) {
- e_preventDefault(e);
- restartBlink(cm);
- signalLater(cm, "keyHandled", cm, "'" + ch + "'", e);
- }
- return handled;
- }
-
- var lastStoppedKey = null;
- function onKeyDown(e) {
- var cm = this;
- if (!cm.state.focused) onFocus(cm);
- if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addS
<TRUNCATED>
[09/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugAction.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugAction.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugAction.java
new file mode 100644
index 0000000..8e5822d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugAction.java
@@ -0,0 +1,257 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.debug;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.commons.debug.DebuggableWithTitle;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.util.Dump;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.Action;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+
+public class DebugAction implements Action {
+ private final Dispatcher dispatcher;
+
+ public DebugAction(final Dispatcher dispatcher) {
+ this.dispatcher = dispatcher;
+ }
+
+ @Override
+ public String getName() {
+ return "debug";
+ }
+
+ @Override
+ public void debug(final DebugBuilder debug) {
+ }
+
+ @Override
+ public void process(final RequestContext context) throws IOException {
+ if (context.isDebugDisabled()) {
+ throw new ForbiddenException("Can't access debug action when debug is disabled");
+ }
+
+ final String action = context.getParameter("action");
+ if ("list-i18n".equals(action)) {
+ i18n(context, null);
+ } else if ("list-authorization".equals(action)) {
+ authorization(context, null);
+ } else if (context.getParameter("mode") != null) {
+ final boolean isDebugOn = context.getParameter("mode").equals("debug");
+ context.addVariable("debug-on", isDebugOn, Scope.SESSION);
+ // TODO need to use configuration to find path
+ context.setRequestPath("/debug/debug.shtml");
+ } else {
+
+ // TODO remove - replaced by Debug tag
+ final DebugHtmlWriter view = new DebugHtmlWriter(context.getWriter(), true);
+ view.appendln("<div class=\"links\">");
+ view.appendln("<a href=\"debug.app?action=system\">System</a>");
+ view.appendln(" | <a href=\"debug.app?action=specifications\">List specifications</a>");
+ view.appendln(" | <a href=\"debug.app?action=list-i18n\">I18N File</a>");
+ view.appendln(" | <a href=\"debug.app?action=list-authorization\">Authorization File</a>");
+ view.appendln(" | <a href=\"debug.app?action=context\">Context</a>");
+ view.appendln(" | <a href=\"debug.app?action=dispatcher\">Dispatcher</a>");
+ view.appendln("</div>");
+
+ if ("specifications".equals(action)) {
+ listSpecifications(view);
+ } else if ("specification".equals(action)) {
+ // specification(context, view);
+ } else if ("object".equals(action)) {
+ object(context, view);
+ } else if ("system".equals(action)) {
+ system(context, view);
+ } else if ("context".equals(action)) {
+ context.append(view);
+ } else if ("dispatcher".equals(action)) {
+ dispatcher.debug(view);
+ }
+
+ context.clearRequestedPath();
+ }
+ }
+
+ private void object(final RequestContext context, final DebugHtmlWriter view) {
+ final ObjectAdapter object = context.getMappedObjectOrResult(context.getParameter("object"));
+ final DebugString str = new DebugString();
+ Dump.adapter(object, str);
+ Dump.graph(object, IsisContext.getAuthenticationSession(), str);
+ view.appendTitle(object.getSpecification().getFullIdentifier());
+ view.appendln("<pre class=\"debug\">" + str + "</pre>");
+ }
+
+ private void system(final RequestContext context, final DebugHtmlWriter view) {
+ final DebuggableWithTitle[] debug = IsisContext.debugSystem();
+ view.appendTitle("System");
+ for (final DebuggableWithTitle element2 : debug) {
+ final DebugString str = new DebugString();
+ element2.debugData(str);
+ view.appendTitle(element2.debugTitle());
+ view.appendln("<pre class=\"debug\">" + str + "</pre>");
+ }
+ }
+
+ private void i18n(final RequestContext context, final DebugHtmlWriter view) {
+ final Collection<ObjectSpecification> allSpecifications = getSpecificationLoader().allSpecifications();
+ final List<ObjectSpecification> specs = Lists.newArrayList(allSpecifications);
+ Collections.sort(specs, new Comparator<ObjectSpecification>() {
+ @Override
+ public int compare(final ObjectSpecification o1, final ObjectSpecification o2) {
+ return o1.getShortIdentifier().compareTo(o2.getShortIdentifier());
+ }
+ });
+ final Function<ObjectSpecification, String> className = ObjectSpecification.FUNCTION_FULLY_QUALIFIED_CLASS_NAME;
+ final List<String> fullIdentifierList = Lists.newArrayList(Collections2.transform(specs, className));
+ for (final String fullIdentifier : fullIdentifierList) {
+ final ObjectSpecification spec = getSpecificationLoader().loadSpecification(fullIdentifier);
+ if (spec.getAssociations(Contributed.EXCLUDED).size() == 0 && spec.getObjectActions(Contributed.EXCLUDED).size() == 0) {
+ continue;
+ }
+ final String name = spec.getIdentifier().toClassIdentityString();
+ context.getWriter().append("# " + spec.getShortIdentifier() + "\n");
+ for (final ObjectAssociation assoc : spec.getAssociations(Contributed.EXCLUDED)) {
+ context.getWriter().append("#" + name + ".property." + assoc.getId() + ".name" + "=\n");
+ context.getWriter().append("#" + name + ".property." + assoc.getId() + ".description" + "=\n");
+ context.getWriter().append("#" + name + ".property." + assoc.getId() + ".help" + "=\n");
+ }
+ for (final ObjectAction action : spec.getObjectActions(Contributed.EXCLUDED)) {
+ context.getWriter().append("#" + name + ".action." + action.getId() + ".name" + "=\n");
+ context.getWriter().append("#" + name + ".action." + action.getId() + ".description" + "=\n");
+ context.getWriter().append("#" + name + ".action." + action.getId() + ".help" + "=\n");
+ }
+ context.getWriter().append("\n");
+ }
+ }
+
+ private void authorization(final RequestContext context, final DebugHtmlWriter view) {
+ final Collection<ObjectSpecification> allSpecifications = getSpecificationLoader().allSpecifications();
+ final List<ObjectSpecification> specs = Lists.newArrayList(allSpecifications);
+ Collections.sort(specs, new Comparator<ObjectSpecification>() {
+ @Override
+ public int compare(final ObjectSpecification o1, final ObjectSpecification o2) {
+ return o1.getShortIdentifier().compareTo(o2.getShortIdentifier());
+ }
+ });
+ final Function<ObjectSpecification, String> className = ObjectSpecification.FUNCTION_FULLY_QUALIFIED_CLASS_NAME;
+ final List<String> fullIdentifierList = Lists.newArrayList(Collections2.transform(specs, className));
+
+ for (final String fullIdentifier : fullIdentifierList) {
+ final ObjectSpecification spec = getSpecificationLoader().loadSpecification(fullIdentifier);
+ if (spec.getAssociations(Contributed.EXCLUDED).size() == 0 && spec.getObjectActions(Contributed.EXCLUDED).size() == 0) {
+ continue;
+ }
+ final String name = spec.getIdentifier().toClassIdentityString();
+ boolean isAbstract = spec.isAbstract();
+ context.getWriter().append("### " + spec.getShortIdentifier() + (isAbstract ? " (abstract)" : "") + " ###\n");
+ context.getWriter().append((isAbstract ? "#" : "") + name + ":roles\n\n");
+ }
+ context.getWriter().append("\n\n");
+
+ for (final String fullIdentifier : fullIdentifierList) {
+ final ObjectSpecification spec = getSpecificationLoader().loadSpecification(fullIdentifier);
+ if (spec.getAssociations(Contributed.EXCLUDED).size() == 0 && spec.getObjectActions(Contributed.EXCLUDED).size() == 0) {
+ continue;
+ }
+ final String name = spec.getIdentifier().toClassIdentityString();
+ boolean isAbstract = spec.isAbstract();
+ context.getWriter().append("### " + spec.getShortIdentifier() + (isAbstract ? " (abstract)" : "") + " ###\n");
+ context.getWriter().append((isAbstract ? "#" : "") + name + ":roles\n");
+ for (final ObjectAssociation assoc : spec.getAssociations(Contributed.EXCLUDED)) {
+ context.getWriter().append("#" + name + "#" + assoc.getId() + ":roles\n");
+ // context.getWriter().append("#" + name + ".property." +
+ // assoc.getId() + ".description" + "=\n");
+ // context.getWriter().append("#" + name + ".property." +
+ // assoc.getId() + ".help" + "=\n");
+ }
+ for (final ObjectAction action : spec.getObjectActions(Contributed.EXCLUDED)) {
+ context.getWriter().append("#" + name + "#" + action.getId() + "():roles\n");
+ // context.getWriter().append("#" + name + ".action." +
+ // action.getId() + ".description" + "=\n");
+ // context.getWriter().append("#" + name + ".action." +
+ // action.getId() + ".help" + "=\n");
+ }
+ context.getWriter().append("\n");
+ }
+ }
+
+ private void listSpecifications(final DebugHtmlWriter view) {
+ final List<ObjectSpecification> fullIdentifierList = new ArrayList<ObjectSpecification>(getSpecificationLoader().allSpecifications());
+ Collections.sort(fullIdentifierList, ObjectSpecification.COMPARATOR_SHORT_IDENTIFIER_IGNORE_CASE);
+ view.appendTitle("Specifications");
+ for (final ObjectSpecification spec : fullIdentifierList) {
+ final String name = spec.getSingularName();
+ view.appendln(name, "");
+ // view.appendln(name, specificationLink(spec));
+ }
+
+ /*
+ * new Comparator<ObjectSpecification>() { public int
+ * compare(ObjectSpecification o1, ObjectSpecification o2) { return
+ * o1.getSingularName().compareTo(o2.getSingularName()); }});
+ *
+ * /* Collection<ObjectSpecification> allSpecifications =
+ * getSpecificationLoader().allSpecifications(); Collection<String> list
+ * = Collections2.transform(allSpecifications,
+ * ObjectSpecification.COMPARATOR_SHORT_IDENTIFIER_IGNORE_CASE); final
+ * List<String> fullIdentifierList = Lists.newArrayList(list); /*
+ * Collections.sort(fullIdentifierList, new
+ * Comparator<ObjectSpecification>() { public int
+ * compare(ObjectSpecification o1, ObjectSpecification o2) { return
+ * o1.getSingularName().compareTo(o2.getSingularName()); }});
+ */
+ /*
+ * view.divider("Specifications"); for (String fullIdentifier :
+ * fullIdentifierList) { ObjectSpecification spec =
+ * getSpecificationLoader().loadSpecification(fullIdentifier); String
+ * name = spec.getSingularName(); view.appendRow(name,
+ * specificationLink(spec)); }
+ */
+ }
+
+ protected SpecificationLoaderSpi getSpecificationLoader() {
+ return IsisContext.getSpecificationLoader();
+ }
+
+ @Override
+ public void init() {
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugHtmlWriter.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugHtmlWriter.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugHtmlWriter.java
new file mode 100644
index 0000000..112bc77
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugHtmlWriter.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.debug;
+
+import java.io.PrintWriter;
+
+import org.apache.isis.core.commons.debug.DebugHtmlStringAbstract;
+
+public class DebugHtmlWriter extends DebugHtmlStringAbstract {
+
+ private final PrintWriter writer;
+
+ public DebugHtmlWriter(final PrintWriter writer, final boolean createPage) {
+ super(createPage);
+ this.writer = writer;
+ header();
+ }
+
+ @Override
+ protected void appendHtml(final String html) {
+ writer.println(html);
+ }
+
+ @Override
+ protected void doClose() {
+ footer();
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUserAction.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUserAction.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUserAction.java
new file mode 100644
index 0000000..461ce84
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUserAction.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.debug;
+
+import java.io.IOException;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.viewer.scimpi.dispatcher.Action;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+
+public class DebugUserAction implements Action {
+
+ private final DebugUsers debugUsers;
+
+ public DebugUserAction(final DebugUsers debugUsers) {
+ this.debugUsers = debugUsers;
+ }
+
+ @Override
+ public String getName() {
+ return "debug-user";
+ }
+
+ @Override
+ public void debug(final DebugBuilder debug) {
+ }
+
+ @Override
+ public void process(final RequestContext context) throws IOException {
+ if (context.isDebugDisabled()) {
+ throw new ForbiddenException("Can't access debug action when debug is disabled");
+ }
+
+ final String method = context.getParameter(METHOD);
+ final String name = context.getParameter(NAME);
+ final String view = context.getParameter(VIEW);
+
+ if (method != null && method.equals("add")) {
+ debugUsers.add(name);
+ } else if (method != null && method.equals("remove")) {
+ debugUsers.remove(name);
+ } else {
+ throw new ScimpiException("Invalid debug-user action");
+ }
+
+ context.setRequestPath(view);
+ }
+
+ @Override
+ public void init() {
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsers.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsers.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsers.java
new file mode 100644
index 0000000..20497cc
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsers.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.debug;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.config.ConfigurationConstants;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+
+public class DebugUsers {
+
+ private static Logger LOG = LoggerFactory.getLogger(DebugUsers.class);
+
+ private enum DebugMode {
+ OFF, ON, NAMED, SYSADMIN_ONLY
+ }
+
+ private static List<String> debugUsers = new ArrayList<String>();
+ private static DebugMode debugMode;
+
+ public void initialize() {
+ if (debugMode != null) {
+ throw new ScimpiException("Debug mode is already set up!");
+ }
+
+ final String debugUserEntry = IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.debug.users", "");
+ final String[] users = debugUserEntry.split("\\|");
+ for (final String name : users) {
+ debugUsers.add(name.trim());
+ }
+
+ final String debugModeEntry = IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.debug.mode");
+ if (debugModeEntry != null) {
+ try {
+ debugMode = DebugMode.valueOf(debugModeEntry.toUpperCase());
+ LOG.info("Debug mode set to " + debugMode);
+ } catch (final IllegalArgumentException e) {
+ LOG.error("Invalid debug mode - " + debugModeEntry + " - mode set to OFF");
+ debugMode = DebugMode.OFF;
+ }
+ } else {
+ debugMode = DebugMode.OFF;
+ }
+ }
+
+ public boolean isDebugEnabled(final AuthenticationSession session) {
+ if (debugMode == DebugMode.ON) {
+ return true;
+ } else if (session != null && debugMode == DebugMode.SYSADMIN_ONLY && session.getRoles().contains("sysadmin")) {
+ return true;
+ } else if (session != null && debugMode == DebugMode.NAMED && (debugUsers.contains(session.getUserName()) || session.getRoles().contains("sysadmin"))) {
+ return true;
+ }
+ return false;
+ }
+
+ public List<String> getNames() {
+ final ArrayList<String> users = new ArrayList<String>(debugUsers);
+ Collections.sort(users);
+ return users;
+ }
+
+ public void add(final String name) {
+ if (!debugUsers.contains(name)) {
+ debugUsers.add(name);
+ LOG.info("Added '" + debugMode + "' to debug users list");
+ }
+ }
+
+ public void remove(final String name) {
+ debugUsers.remove(name);
+ LOG.info("Removed '" + debugMode + "' from debug users list");
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsersView.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsersView.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsersView.java
new file mode 100644
index 0000000..360c48a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/DebugUsersView.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.debug;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class DebugUsersView extends AbstractElementProcessor {
+
+ @Override
+ public String getName() {
+ return "debug-users";
+ }
+
+ @Override
+ public void process(final Request request) {
+ final String view = request.getContext().getContextPath() + request.getContext().getResourceParentPath() + request.getContext().getResourceFile();
+
+ request.appendHtml("<form class=\"generic action\" action=\"debug-user.app\" method=\"post\" accept-charset=\"ISO-8859-1\">\n");
+ request.appendHtml("<div class=\"title\">Add Debug User</div>\n");
+ request.appendHtml("<div class=\"field\"><label>User Name:</label><input type=\"text\" name=\"name\" size=\"30\" /></div>\n");
+ request.appendHtml("<input type=\"hidden\" name=\"method\" value=\"add\" />\n");
+ request.appendHtml("<input type=\"hidden\" name=\"view\" value=\"" + view + "\" />\n");
+ request.appendHtml("<input class=\"button\" type=\"submit\" value=\"Add User\" />\n");
+ request.appendHtml("</form>\n");
+
+ request.appendHtml("<table class=\"debug\">\n<tr><th class=\"title\">Name</th><th class=\"title\"></th></tr>\n");
+ for (final String name : request.getContext().getDebugUsers()) {
+ request.appendHtml("<tr><th>" + name + "</th><th><a href=\"debug-user.app?method=remove&name=" + name + "&view=" + view + " \">remove</a></th></tr>\n");
+ }
+ request.appendHtml("</table>\n");
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorDetails.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorDetails.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorDetails.java
new file mode 100644
index 0000000..3049b26
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorDetails.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.debug;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+
+public class ErrorDetails extends AbstractElementProcessor {
+
+ public String getName() {
+ return "error-details";
+ }
+
+ public void process(final Request request) {
+ request.appendHtml(request.getContext().getErrorDetails());
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorMessage.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorMessage.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorMessage.java
new file mode 100644
index 0000000..07538ce
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorMessage.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.debug;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+
+public class ErrorMessage extends AbstractElementProcessor {
+
+ public String getName() {
+ return "error-message";
+ }
+
+ public void process(final Request request) {
+ request.appendAsHtmlEncoded(request.getContext().getErrorMessage());
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorReference.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorReference.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorReference.java
new file mode 100644
index 0000000..75700cc
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/ErrorReference.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.debug;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+
+public class ErrorReference extends AbstractElementProcessor {
+
+ public String getName() {
+ return "error-reference";
+ }
+
+ public void process(final Request request) {
+ request.appendAsHtmlEncoded(request.getContext().getErrorReference());
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/LogAction.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/LogAction.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/LogAction.java
new file mode 100644
index 0000000..6c30c19
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/debug/LogAction.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.debug;
+
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.viewer.scimpi.dispatcher.Action;
+import org.apache.isis.viewer.scimpi.dispatcher.NotLoggedInException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+
+public class LogAction implements Action {
+
+ private static final Logger LOG = LoggerFactory.getLogger(LogAction.class);
+
+ @Override
+ public void process(final RequestContext context) throws IOException {
+
+ final AuthenticationSession session = context.getSession();
+ if (session == null) {
+ throw new NotLoggedInException();
+ }
+
+ final String levelName = (String) context.getVariable("level");
+
+ final org.apache.log4j.Level level = org.apache.log4j.Level.toLevel(levelName);
+ boolean changeLogged = false;
+ if (org.apache.log4j.Level.INFO.isGreaterOrEqual(org.apache.log4j.LogManager.getRootLogger().getLevel())) {
+ LOG.info("log level changed to " + level);
+ changeLogged = true;
+ }
+ org.apache.log4j.LogManager.getRootLogger().setLevel(level);
+ if (!changeLogged) {
+ LOG.info("log level changed to " + level);
+ }
+ final String view = (String) context.getVariable("view");
+ context.setRequestPath(view);
+
+ }
+
+ @Override
+ public String getName() {
+ return "log";
+ }
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public void debug(final DebugBuilder debug) {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
new file mode 100644
index 0000000..852ccea
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
@@ -0,0 +1,266 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.edit;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AnonymousSession;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.authentication.MessageBroker;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.Veto;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.Action;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.NotLoggedInException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+
+public class EditAction implements Action {
+ public static final String ACTION = "edit";
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ public String getName() {
+ return ACTION;
+ }
+
+ @Override
+ public void process(final RequestContext context) throws IOException {
+ AuthenticationSession session = context.getSession();
+ if (session == null) {
+ session = new AnonymousSession();
+ }
+
+ try {
+ final String objectId = context.getParameter("_" + OBJECT);
+ final String version = context.getParameter("_" + VERSION);
+ final String formId = context.getParameter("_" + FORM_ID);
+ String resultName = context.getParameter("_" + RESULT_NAME);
+ resultName = resultName == null ? RequestContext.RESULT : resultName;
+ final String override = context.getParameter("_" + RESULT_OVERRIDE);
+ String message = context.getParameter("_" + MESSAGE);
+
+ final ObjectAdapter adapter = context.getMappedObject(objectId);
+
+ final List<ObjectAssociation> fields = adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, adapter, where));
+
+ for (final ObjectAssociation objectAssociation : fields) {
+ if (objectAssociation.isVisible(session, adapter, where).isVetoed()) {
+ throw new NotLoggedInException();
+ }
+ }
+
+ final FormState entryState = validateObject(context, adapter, fields);
+ final Version adapterVersion = adapter.getVersion();
+ final Version formVersion = context.getVersion(version);
+ if (formVersion != null && adapterVersion.different(formVersion)) {
+
+ IsisContext.getMessageBroker().addMessage("The " + adapter.getSpecification().getSingularName() + " was edited " + "by another user (" + adapterVersion.getUser() + "). Please make your changes based on their changes.");
+
+ final String view = context.getParameter("_" + ERROR);
+ context.setRequestPath(view, Dispatcher.EDIT);
+
+ entryState.setForm(formId);
+ context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
+ context.addVariable(resultName, objectId, Scope.REQUEST);
+ if (override != null) {
+ context.addVariable(resultName, override, Scope.REQUEST);
+ }
+
+ } else if (entryState.isValid()) {
+ changeObject(context, adapter, entryState, fields);
+
+ if (adapter.isTransient()) {
+ IsisContext.getPersistenceSession().makePersistent(adapter);
+ context.unmapObject(adapter, Scope.REQUEST);
+ }
+
+ String view = context.getParameter("_" + VIEW);
+
+ final String id = context.mapObject(adapter, Scope.REQUEST);
+ context.addVariable(resultName, id, Scope.REQUEST);
+ if (override != null) {
+ context.addVariable(resultName, override, Scope.REQUEST);
+ }
+
+ final int questionMark = view == null ? -1 : view.indexOf("?");
+ if (questionMark > -1) {
+ final String params = view.substring(questionMark + 1);
+ final int equals = params.indexOf("=");
+ context.addVariable(params.substring(0, equals), params.substring(equals + 1), Scope.REQUEST);
+ view = view.substring(0, questionMark);
+ }
+ context.setRequestPath(view);
+ if (message == null) {
+ message = "Saved changes to " + adapter.getSpecification().getSingularName();
+ } else if (message.equals("")) {
+ message = null;
+ }
+ if (message != null) {
+ final MessageBroker messageBroker = IsisContext.getMessageBroker();
+ messageBroker.addMessage(message);
+ }
+
+ } else {
+ final String view = context.getParameter("_" + ERROR);
+ context.setRequestPath(view, Dispatcher.EDIT);
+
+ entryState.setForm(formId);
+ context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
+ context.addVariable(resultName, objectId, Scope.REQUEST);
+ if (override != null) {
+ context.addVariable(resultName, override, Scope.REQUEST);
+ }
+
+ final MessageBroker messageBroker = IsisContext.getMessageBroker();
+ messageBroker.addWarning(entryState.getError());
+ }
+
+ } catch (final RuntimeException e) {
+ IsisContext.getMessageBroker().getMessages();
+ IsisContext.getMessageBroker().getWarnings();
+ throw e;
+ }
+ }
+
+ private FormState validateObject(final RequestContext context, final ObjectAdapter object, final List<ObjectAssociation> fields) {
+ final FormState formState = new FormState();
+ for (int i = 0; i < fields.size(); i++) {
+ final ObjectAssociation field = fields.get(i);
+ final String fieldId = field.getId();
+ String newEntry = context.getParameter(fieldId);
+ if (fields.get(i).isOneToManyAssociation()) {
+ continue;
+ }
+ if (fields.get(i).isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
+ continue;
+ }
+ if (field.isUsable(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
+ continue;
+ }
+
+ if (newEntry != null && newEntry.equals("-OTHER-")) {
+ newEntry = context.getParameter(fieldId + "-other");
+ }
+
+ if (newEntry == null) {
+ // TODO duplicated in EditObject; line 97
+ final ObjectSpecification spec = field.getSpecification();
+ if (spec.isOfType(IsisContext.getSpecificationLoader().loadSpecification(boolean.class)) || spec.isOfType(IsisContext.getSpecificationLoader().loadSpecification(Boolean.class))) {
+ newEntry = FALSE;
+ } else {
+ continue;
+ }
+ }
+ final FieldEditState fieldState = formState.createField(fieldId, newEntry);
+
+ Consent consent = null;
+ if (field.isMandatory() && (newEntry.equals("") || newEntry.equals("NULL"))) {
+ consent = new Veto(field.getName() + " required");
+ formState.setError("Not all fields have been set");
+ } else if (field.getSpecification().containsFacet(ParseableFacet.class)) {
+ try {
+ final ParseableFacet facet = field.getSpecification().getFacet(ParseableFacet.class);
+ final ObjectAdapter originalValue = field.get(object);
+ Localization localization = IsisContext.getLocalization();
+ final ObjectAdapter newValue = facet.parseTextEntry(originalValue, newEntry, localization);
+ consent = ((OneToOneAssociation) field).isAssociationValid(object, newValue);
+ fieldState.setValue(newValue);
+ } catch (final TextEntryParseException e) {
+ consent = new Veto(e.getMessage());
+ // formState.setError("Not all fields have been entered correctly");
+ }
+
+ } else {
+ final ObjectAdapter associate = newEntry.equals("null") ? null : context.getMappedObject(newEntry);
+ if (associate != null) {
+ IsisContext.getPersistenceSession().resolveImmediately(associate);
+ }
+ consent = ((OneToOneAssociation) field).isAssociationValid(object, associate);
+ fieldState.setValue(associate);
+
+ }
+ if (consent.isVetoed()) {
+ fieldState.setError(consent.getReason());
+ formState.setError("Not all fields have been entered correctly");
+ }
+ }
+
+ // TODO check the state of the complete object.
+ return formState;
+ }
+
+ private void changeObject(final RequestContext context, final ObjectAdapter object, final FormState editState, final List<ObjectAssociation> fields) {
+ for (int i = 0; i < fields.size(); i++) {
+ final FieldEditState field = editState.getField(fields.get(i).getId());
+ if (field == null) {
+ continue;
+ }
+ final String newEntry = field.getEntry();
+ final ObjectAdapter originalValue = fields.get(i).get(object);
+ final boolean isVisible = fields.get(i).isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed();
+ final boolean isUsable = fields.get(i).isUsable(IsisContext.getAuthenticationSession(), object, where).isAllowed();
+ final boolean bothEmpty = originalValue == null && newEntry.equals("");
+ final boolean bothSame = newEntry.equals(originalValue == null ? "" : originalValue.titleString());
+ if ((!isVisible || !isUsable) || bothEmpty || bothSame) {
+ if (fields.get(i).getSpecification().getFacet(ParseableFacet.class) == null) {
+ // REVIEW restores object to loader
+ context.getMappedObject(newEntry);
+ }
+ continue;
+ }
+
+ if (fields.get(i).getSpecification().containsFacet(ParseableFacet.class)) {
+ final ParseableFacet facet = fields.get(i).getSpecification().getFacet(ParseableFacet.class);
+ Localization localization = IsisContext.getLocalization();
+ final ObjectAdapter newValue = facet.parseTextEntry(originalValue, newEntry, localization);
+ ((OneToOneAssociation) fields.get(i)).set(object, newValue);
+ } else {
+ ((OneToOneAssociation) fields.get(i)).set(object, field.getValue());
+ }
+ }
+ }
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public void debug(final DebugBuilder debug) {
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FieldEditState.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FieldEditState.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FieldEditState.java
new file mode 100644
index 0000000..70e6789
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FieldEditState.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.edit;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+
+public class FieldEditState {
+ private final String entry;
+ private String reason;
+ private ObjectAdapter value;
+
+ public FieldEditState(final String entry) {
+ this.entry = entry;
+ }
+
+ public void setError(final String reason) {
+ this.reason = reason;
+ }
+
+ public boolean isEntryValid() {
+ return reason == null;
+ }
+
+ public String getEntry() {
+ return entry;
+ }
+
+ public String getError() {
+ return reason;
+ }
+
+ public ObjectAdapter getValue() {
+ return value;
+ }
+
+ public void setValue(final ObjectAdapter value) {
+ this.value = value;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FormState.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FormState.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FormState.java
new file mode 100644
index 0000000..7349837
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FormState.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.edit;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public class FormState {
+ private final Map<String, FieldEditState> fields = new HashMap<String, FieldEditState>();
+ private String error;
+ private String formId;
+
+ public FieldEditState createField(final String name, final String entry) {
+ final FieldEditState fieldEditState = new FieldEditState(entry);
+ fields.put(name, fieldEditState);
+ return fieldEditState;
+ }
+
+ public boolean isValid() {
+ final Iterator<FieldEditState> iterator = fields.values().iterator();
+ while (iterator.hasNext()) {
+ if (!iterator.next().isEntryValid()) {
+ return false;
+ }
+ }
+ return error == null;
+ }
+
+ public FieldEditState getField(final String name) {
+ return fields.get(name);
+ }
+
+ public void setError(final String error) {
+ this.error = error;
+ }
+
+ public String getError() {
+ return error;
+ }
+
+ public void setForm(final String formId) {
+ this.formId = formId;
+ }
+
+ public boolean isForForm(final String formId) {
+ return this.formId == null || this.formId.equals(formId);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/RemoveAction.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/RemoveAction.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/RemoveAction.java
new file mode 100644
index 0000000..919ccc2
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/RemoveAction.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.edit;
+
+import java.io.IOException;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.authentication.AnonymousSession;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.Action;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+
+/**
+ * Remove an element from a collection.
+ */
+public class RemoveAction implements Action {
+ public static final String ACTION = "remove";
+
+ // REVIEW: confirm this rendering context
+ private final Where where = Where.OBJECT_FORMS;
+
+ @Override
+ public String getName() {
+ return ACTION;
+ }
+
+ @Override
+ public void process(final RequestContext context) throws IOException {
+ AuthenticationSession session = context.getSession();
+ if (session == null) {
+ session = new AnonymousSession();
+ }
+
+ final String parentId = context.getParameter(OBJECT);
+ final String rowId = context.getParameter(ELEMENT);
+
+ try {
+ final ObjectAdapter parent = context.getMappedObject(parentId);
+ final ObjectAdapter row = context.getMappedObject(rowId);
+
+ final String fieldName = context.getParameter(FIELD);
+ final ObjectAssociation field = parent.getSpecification().getAssociation(fieldName);
+ if (field == null) {
+ throw new ScimpiException("No field " + fieldName + " in " + parent.getSpecification().getFullIdentifier());
+ }
+ if (field.isVisible(IsisContext.getAuthenticationSession(), parent, where).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+
+ ((OneToManyAssociation) field).removeElement(parent, row);
+
+ // TODO duplicated in EditAction
+ String view = context.getParameter(VIEW);
+ final String override = context.getParameter(RESULT_OVERRIDE);
+
+ String resultName = context.getParameter(RESULT_NAME);
+ resultName = resultName == null ? RequestContext.RESULT : resultName;
+
+ final String id = context.mapObject(parent, Scope.REQUEST);
+ context.addVariable(resultName, id, Scope.REQUEST);
+ if (override != null) {
+ context.addVariable(resultName, override, Scope.REQUEST);
+ }
+
+ final int questionMark = view == null ? -1 : view.indexOf("?");
+ if (questionMark > -1) {
+ final String params = view.substring(questionMark + 1);
+ final int equals = params.indexOf("=");
+ context.addVariable(params.substring(0, equals), params.substring(equals + 1), Scope.REQUEST);
+ view = view.substring(0, questionMark);
+ }
+ context.setRequestPath(view);
+ // TODO end of duplication
+
+ } catch (final RuntimeException e) {
+ IsisContext.getMessageBroker().getMessages();
+ IsisContext.getMessageBroker().getWarnings();
+ throw e;
+ }
+ }
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public void debug(final DebugBuilder debug) {
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/DomainSession.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/DomainSession.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/DomainSession.java
new file mode 100644
index 0000000..55809e0
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/DomainSession.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.logon;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSessionAbstract;
+import org.apache.isis.core.commons.encoding.DataInputExtended;
+
+public class DomainSession extends AuthenticationSessionAbstract {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String CODE = "";
+
+ public DomainSession(final String username, final List<String> roles) {
+ super(username, roles, CODE);
+ }
+
+ public DomainSession(final DataInputExtended input) throws IOException {
+ super(input);
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogonAction.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogonAction.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogonAction.java
new file mode 100644
index 0000000..e90740a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogonAction.java
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.logon;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.authentication.AuthenticationRequestPassword;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.Action;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.UserManager;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+
+public class LogonAction implements Action {
+
+ @Override
+ public void process(final RequestContext context) throws IOException {
+ String username = context.getParameter("username");
+ String password = context.getParameter("password");
+ final String actualFormId = context.getParameter("_" + FORM_ID);
+ final String expectedFormId = context.getParameter(LOGON_FORM_ID);
+ boolean isDomainLogon = expectedFormId != null && expectedFormId.equals(actualFormId);
+ boolean isValid;
+
+ if (username == null || password == null) {
+ context.redirectTo("/");
+ return;
+ }
+ AuthenticationSession session = null;
+ if (username.length() == 0 || password.length() == 0) {
+ isValid = false;
+ } else {
+ if (isDomainLogon) {
+ final String objectId = context.getParameter(LOGON_OBJECT);
+ final String scope = context.getParameter(LOGON_SCOPE);
+ final String loginMethodName = context.getParameter(LOGON_METHOD);
+ final String roleFieldName = context.getParameter(PREFIX + "roles-field");
+ String resultName = context.getParameter(LOGON_RESULT_NAME);
+ resultName = resultName == null ? "_" + USER : resultName;
+
+ final ObjectAdapter object = MethodsUtils.findObject(context, objectId);
+ final ObjectAction loginAction = MethodsUtils.findAction(object, loginMethodName);
+ final int parameterCount = loginAction.getParameterCount();
+ final ObjectAdapter[] parameters = new ObjectAdapter[parameterCount];
+ List<ObjectActionParameter> parameters2 = loginAction.getParameters();
+ if (parameters.length != 2) {
+ throw new ScimpiException("Expected two parameters for the log-on method: " + loginMethodName);
+ }
+
+ Localization localization = IsisContext.getLocalization();
+ ParseableFacet facet = parameters2.get(0).getSpecification().getFacet(ParseableFacet.class);
+ parameters[0] = facet.parseTextEntry(null, username, localization);
+ facet = parameters2.get(1).getSpecification().getFacet(ParseableFacet.class);
+ parameters[1] = facet.parseTextEntry(null, password, localization);
+ final ObjectAdapter result = loginAction.execute(object, parameters);
+ isValid = result != null;
+ if (isValid) {
+ ObjectSpecification specification = result.getSpecification();
+ ObjectAssociation association = specification.getAssociation(roleFieldName);
+ if (association == null) {
+ throw new ScimpiException("Expected a role name field called: " + roleFieldName);
+ }
+ ObjectAdapter role = association.get(result);
+ List<String> roles = new ArrayList<String>();
+ if (role != null) {
+ String[] split = role.titleString().split("\\|");
+ for (String r : split) {
+ roles.add(r);
+ }
+ }
+ //String domainRoleName = role == null ? "" : role.titleString();
+
+
+ Scope scope2 = scope == null ? Scope.SESSION : RequestContext.scope(scope);
+ final String resultId = context.mapObject(result, scope2);
+ context.addVariable(resultName, resultId, scope);
+ context.addVariable("_username", username, Scope.SESSION);
+
+ context.clearVariable(LOGON_OBJECT, Scope.SESSION);
+ context.clearVariable(LOGON_METHOD, Scope.SESSION);
+ context.clearVariable(LOGON_RESULT_NAME, Scope.SESSION);
+ context.clearVariable(LOGON_SCOPE, Scope.SESSION);
+ context.clearVariable(PREFIX + "roles-field", Scope.SESSION);
+ // context.clearVariable(PREFIX + "isis-user", Scope.SESSION);
+ context.clearVariable(LOGON_FORM_ID, Scope.SESSION);
+
+ session = new DomainSession(result.titleString(), roles);
+ } else {
+ session = context.getSession();
+ }
+
+ } else {
+ session = UserManager.authenticate(new AuthenticationRequestPassword(username, password));
+ isValid = session != null;
+ }
+ }
+
+ String view;
+ if (!isValid) {
+ final FormState formState = new FormState();
+ formState.setForm(actualFormId);
+ formState.setError("Failed to login. Check the username and ensure that your password was entered correctly");
+ FieldEditState fieldState = formState.createField("username", username);
+ if (username.length() == 0) {
+ fieldState.setError("User Name required");
+ }
+ fieldState = formState.createField("password", password);
+ if (password.length() == 0) {
+ fieldState.setError("Password required");
+ }
+ if (username.length() == 0 || password.length() == 0) {
+ formState.setError("Both the user name and password must be entered");
+ }
+ context.addVariable(ENTRY_FIELDS, formState, Scope.REQUEST);
+
+ view = context.getParameter(ERROR);
+ context.setRequestPath("/" + view, Dispatcher.ACTION);
+ } else {
+ context.setSession(session);
+ context.startHttpSession();
+ context.setUserAuthenticated(true);
+ view = context.getParameter(VIEW);
+ if (view == null) {
+ // REVIEW this is duplicated in Logon.java
+ view = "start." + Dispatcher.EXTENSION;
+ }
+ context.redirectTo(view);
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "logon";
+ }
+
+ @Override
+ public void init() {}
+
+ @Override
+ public void debug(final DebugBuilder debug) {}
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogoutAction.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogoutAction.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogoutAction.java
new file mode 100644
index 0000000..a6f4730
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogoutAction.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.logon;
+
+import java.io.IOException;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.Action;
+import org.apache.isis.viewer.scimpi.dispatcher.UserManager;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+
+public class LogoutAction implements Action {
+
+ public static void logoutUser(final RequestContext context) {
+ if (context.isUserAuthenticated()) {
+ final AuthenticationSession session = context.getSession();
+ if (session != null) {
+ UserManager.logoffUser(session);
+ }
+ context.endHttpSession();
+ context.setUserAuthenticated(false);
+ }
+ context.clearVariables(Scope.SESSION);
+ }
+
+ @Override
+ public String getName() {
+ return "logout";
+ }
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public void process(final RequestContext context) throws IOException {
+ logoutUser(context);
+
+ String view = context.getParameter("view");
+ if (view == null) {
+ view = context.getContextPath();
+ }
+ context.redirectTo(view);
+ }
+
+ @Override
+ public void debug(final DebugBuilder debug) {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Encoder.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Encoder.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Encoder.java
new file mode 100644
index 0000000..1efe91e
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Encoder.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.processor;
+
+public interface Encoder {
+
+ String encoder(String text);
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/HtmlFileParser.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/HtmlFileParser.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/HtmlFileParser.java
new file mode 100644
index 0000000..6730510
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/HtmlFileParser.java
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.processor;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Stack;
+
+import org.htmlparser.Node;
+import org.htmlparser.Remark;
+import org.htmlparser.lexer.Lexer;
+import org.htmlparser.lexer.Page;
+import org.htmlparser.nodes.TagNode;
+import org.htmlparser.util.ParserException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.action.Attributes;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.view.HtmlSnippet;
+import org.apache.isis.viewer.scimpi.dispatcher.view.Snippet;
+import org.apache.isis.viewer.scimpi.dispatcher.view.SwfTag;
+
+public class HtmlFileParser {
+ private static final Logger LOG = LoggerFactory.getLogger(HtmlFileParser.class);
+ private final ProcessorLookup processors;
+
+ public HtmlFileParser(final ProcessorLookup processors) {
+ this.processors = processors;
+ }
+
+ public Stack<Snippet> parseHtmlFile(final String filePath, final RequestContext context) {
+ final Stack<Snippet> tagsBeforeContent = new Stack<Snippet>();
+ final Stack<Snippet> tagsAfterContent = new Stack<Snippet>();
+ parseHtmlFile("/", filePath, context, tagsBeforeContent, tagsAfterContent);
+ return tagsBeforeContent;
+ }
+
+ public void parseHtmlFile(final String parentPath, final String filePath, final RequestContext context, final Stack<Snippet> allTags, final Stack<Snippet> tagsForPreviousTemplate) {
+ LOG.debug("parent/file: " + parentPath + " & " + filePath);
+ final File directory = filePath.startsWith("/") ? new File(".") : new File(parentPath);
+ final File loadFile = new File(directory.getParentFile(), filePath);
+ final String loadPath = loadFile.getPath().replace('\\', '/');
+ LOG.debug("loading template '" + loadPath + "'");
+ final InputStream in = context.openStream(loadPath);
+
+ Page page;
+ try {
+ page = new Page(in, null);
+ } catch (final UnsupportedEncodingException e) {
+ throw new ScimpiException(e);
+ }
+ final Lexer lexer = new Lexer(page);
+
+ Node node = null;
+ try {
+ Stack<Snippet> tags = allTags;
+ String lineNumbers = "1";
+ String template = null;
+ tags.push(new HtmlSnippet(lineNumbers, filePath));
+
+ // NOTE done like this the tags can be cached for faster processing
+ while ((node = lexer.nextNode()) != null) {
+ if (node instanceof Remark) {
+ // TODO need to pick up on comments within tags; at the
+ // moment this splits a tag into two causing a
+ // failure later
+ continue;
+
+ } else if (node instanceof TagNode && ((TagNode) node).getTagName().startsWith("SWF:")) {
+ final TagNode tagNode = (TagNode) node;
+ final String tagName = tagNode.getTagName().toUpperCase();
+ LOG.debug(tagName);
+
+ // TODO remove context & request from Attributes -- the tags
+ // will be re-used across
+ // requests
+ final Attributes attributes = new Attributes(tagNode, context);
+ int type = 0;
+ if (tagNode.isEndTag()) {
+ type = SwfTag.END;
+ } else {
+ type = tagNode.isEmptyXmlTag() ? SwfTag.EMPTY : SwfTag.START;
+ }
+ testForProcessorForTag(lexer, tagName);
+ lineNumbers = lineNumbering(node);
+ final SwfTag tag = new SwfTag(tagName, attributes, type, lineNumbers, loadFile.getCanonicalPath());
+ tags.push(tag);
+
+ if (tagName.equals("SWF:IMPORT")) {
+ if (!tagNode.isEmptyXmlTag()) {
+ throw new ScimpiException("Import tag must be empty");
+ }
+ String importFile = tagNode.getAttribute("file");
+ if (context.isDebug()) {
+ context.getWriter().println("<!-- " + "import file " + importFile + " -->");
+ }
+ importFile = context.replaceVariables(importFile);
+ parseHtmlFile(loadPath, importFile, context, tags, tagsForPreviousTemplate);
+ }
+
+ if (tagName.equals("SWF:TEMPLATE")) {
+ if (!tagNode.isEmptyXmlTag()) {
+ throw new ScimpiException("Template tag must be empty");
+ }
+ if (template != null) {
+ throw new ScimpiException("Template tag can only be used once within a file");
+ }
+ template = tagNode.getAttribute("file");
+ template = context.replaceVariables(template);
+ if (context.isDebug()) {
+ context.getWriter().println("<!-- " + "apply template " + template + " -->");
+ }
+ tags = new Stack<Snippet>();
+ }
+
+ if (tagName.equals("SWF:CONTENT")) {
+ if (!tagNode.isEmptyXmlTag()) {
+ throw new ScimpiException("Content tag must be empty");
+ }
+ if (context.isDebug()) {
+ context.getWriter().println("<!-- " + "insert content into template -->");
+ }
+ tags.addAll(tagsForPreviousTemplate);
+ }
+ } else {
+ final Snippet snippet = tags.size() == 0 ? null : tags.peek();
+ if (snippet instanceof HtmlSnippet) {
+ ((HtmlSnippet) snippet).append(node.toHtml());
+ } else {
+ final HtmlSnippet htmlSnippet = new HtmlSnippet(lineNumbers, filePath);
+ htmlSnippet.append(node.toHtml());
+ tags.push(htmlSnippet);
+ }
+ }
+
+ }
+ in.close();
+
+ if (template != null) {
+ final String filePathRoot = loadPath.startsWith("/") ? "" : "/";
+ parseHtmlFile(filePathRoot + loadPath, template, context, allTags, tags);
+ }
+
+ } catch (final ParserException e) {
+ exception(loadPath, node, e);
+ // throw new ScimpiException(e);
+ } catch (final RuntimeException e) {
+ // TODO: extend to deal with other exceptions
+ exception(loadPath, node, e);
+ } catch (final IOException e) {
+ throw new ScimpiException(e);
+ }
+ }
+
+ private void exception(final String filePath, final Node node, final Exception e) {
+ String lineNumbers = "";
+ String element = ("" + node).toLowerCase();
+ if (node instanceof TagNode) {
+ lineNumbers = ":" + lineNumbering(node);
+ element = "tag <" + node.getText() + ">";
+ }
+ throw new ScimpiException("Error processing " + element + " in " + filePath + lineNumbers, e);
+ }
+
+ private String lineNumbering(final Node node) {
+ String lineNumbers;
+ final int startingLine = ((TagNode) node).getStartingLineNumber() + 1;
+ final int endingLine = ((TagNode) node).getStartingLineNumber() + 1;
+ if (startingLine == endingLine) {
+ lineNumbers = "" + startingLine;
+ } else {
+ lineNumbers = startingLine + "-" + endingLine;
+ }
+ return lineNumbers;
+ }
+
+ private void testForProcessorForTag(final Lexer lexer, final String tagName) {
+ final ElementProcessor elementProcessor = processors.getFor(tagName);
+ if (elementProcessor == null) {
+ throw new ScimpiException("No processor for tag " + tagName.toLowerCase());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/PageWriter.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/PageWriter.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/PageWriter.java
new file mode 100644
index 0000000..4e11481
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/PageWriter.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.processor;
+
+public interface PageWriter {
+
+ void appendAsHtmlEncoded(String string);
+
+ void appendHtml(String string);
+
+}
[42/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/application.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/application.js b/example/application/neoapp/webapp/src/main/webapp/scripts/application.js
deleted file mode 100644
index d8cf6fe..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/scripts/application.js
+++ /dev/null
@@ -1,3 +0,0 @@
-$(document).ready(function() {
- /// here...
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG b/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG
deleted file mode 100644
index b6907d1..0000000
Binary files a/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/simpleapp/dom/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/pom.xml b/example/application/simpleapp/dom/pom.xml
index 7d159cf..40a1c10 100644
--- a/example/application/simpleapp/dom/pom.xml
+++ b/example/application/simpleapp/dom/pom.xml
@@ -135,7 +135,7 @@
<plugin>
<groupId>org.apache.isis.tool</groupId>
<artifactId>isis-maven-plugin</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<configuration>
<isisConfigDir>../webapp/src/main/webapp/WEB-INF</isisConfigDir>
</configuration>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/archetype/simpleapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/archetype/simpleapp/pom.xml b/example/archetype/simpleapp/pom.xml
index 0338723..d65e62c 100644
--- a/example/archetype/simpleapp/pom.xml
+++ b/example/archetype/simpleapp/pom.xml
@@ -21,7 +21,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.isis.archetype</groupId>
<artifactId>simpleapp-archetype</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<packaging>maven-archetype</packaging>
<name>simpleapp-archetype</name>
<build>
@@ -44,7 +44,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<relativePath>../../../core/pom.xml</relativePath>
</parent>
</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 23293a6..fb23af6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,6 +62,7 @@
<id>released</id>
<modules>
<module>core</module>
+
<module>example/application/simpleapp</module>
<module>example/archetype/simpleapp</module>
</modules>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/tck/pom.xml
----------------------------------------------------------------------
diff --git a/tck/pom.xml b/tck/pom.xml
index 3da1159..2f564a6 100644
--- a/tck/pom.xml
+++ b/tck/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<relativePath>../core/pom.xml</relativePath>
</parent>
@@ -167,27 +167,27 @@
<dependency>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck-dom</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck-fixture</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck-integtests</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck-viewer-restfulobjects</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</dependency>
</dependencies>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/tck/tck-dom/pom.xml
----------------------------------------------------------------------
diff --git a/tck/tck-dom/pom.xml b/tck/tck-dom/pom.xml
index 1abd818..a1e3080 100644
--- a/tck/tck-dom/pom.xml
+++ b/tck/tck-dom/pom.xml
@@ -22,7 +22,7 @@
<parent>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-tck-dom</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/tck/tck-fixture/pom.xml
----------------------------------------------------------------------
diff --git a/tck/tck-fixture/pom.xml b/tck/tck-fixture/pom.xml
index 82c67b1..d33a23c 100644
--- a/tck/tck-fixture/pom.xml
+++ b/tck/tck-fixture/pom.xml
@@ -22,7 +22,7 @@
<parent>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-tck-fixture</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/tck/tck-integtests/pom.xml
----------------------------------------------------------------------
diff --git a/tck/tck-integtests/pom.xml b/tck/tck-integtests/pom.xml
index dee873d..ceee355 100644
--- a/tck/tck-integtests/pom.xml
+++ b/tck/tck-integtests/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-tck-integtests</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/tck/tck-viewer-restfulobjects/pom.xml
----------------------------------------------------------------------
diff --git a/tck/tck-viewer-restfulobjects/pom.xml b/tck/tck-viewer-restfulobjects/pom.xml
index 1e7d558..8aab6b6 100644
--- a/tck/tck-viewer-restfulobjects/pom.xml
+++ b/tck/tck-viewer-restfulobjects/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-tck-viewer-restfulobjects</artifactId>
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/tck/tck-viewer-wicket/pom.xml
----------------------------------------------------------------------
diff --git a/tck/tck-viewer-wicket/pom.xml b/tck/tck-viewer-wicket/pom.xml
index 19c5930..684dbe8 100644
--- a/tck/tck-viewer-wicket/pom.xml
+++ b/tck/tck-viewer-wicket/pom.xml
@@ -23,17 +23,16 @@
<parent>
<groupId>org.apache.isis.tck</groupId>
<artifactId>isis-tck</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
</parent>
<artifactId>isis-tck-viewer-wicket</artifactId>
- <version>1.9.0-SNAPSHOT</version>
+ <version>1.9.0_dn4-SNAPSHOT</version>
<name>Isis TCK Wicket Viewer tests</name>
<properties>
- <isis-viewer-wicket.version>1.9.0-SNAPSHOT</isis-viewer-wicket.version>
<siteBaseDir>..</siteBaseDir>
<relativeUrl>wicket-tck/</relativeUrl>
<!-- until someone comes up with a better solution -->
@@ -82,7 +81,6 @@
<dependency>
<groupId>org.apache.isis.viewer</groupId>
<artifactId>isis-viewer-wicket-impl</artifactId>
- <version>${isis-viewer-wicket.version}</version>
</dependency>
<!-- isis runtime -->
[12/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ImageLookup.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ImageLookup.java b/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ImageLookup.java
deleted file mode 100644
index 39a703a..0000000
--- a/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ImageLookup.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.servlet;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.ServletContext;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-
-/**
- * ImageLookup provides an efficient way of finding the most suitable image to
- * use. It ensures that an image is always available, providing a default image
- * if needed. All requests are cached to improve performance.
- */
-// TODO allow for multiple extension types
-public class ImageLookup {
- private static final Logger LOG = LoggerFactory.getLogger(ImageLookup.class);
- private static final String UNKNOWN_IMAGE = "Default";
- private static final String[] EXTENSIONS = { "png", "gif", "jpg", "jpeg" };
- private static final Map images = new HashMap();
- private static String imageDirectory;
- // private static String unknownImageFile;
- private static ServletContext context;
-
- public static void setImageDirectory(final ServletContext context, String imageDirectory) {
- LOG.debug("image directory required for: " + imageDirectory);
- ImageLookup.context = context;
- imageDirectory = (imageDirectory.startsWith("/") ? "" : "/") + imageDirectory + "/";
- final Set resourcePaths = context.getResourcePaths(imageDirectory);
- if (resourcePaths == null || resourcePaths.size() == 0) {
- //throw new IsisException("No image directory found: " + imageDirectory);
- LOG.warn("No image directory found: " + imageDirectory);
- }
- LOG.info("image directory set to: " + imageDirectory);
- ImageLookup.imageDirectory = imageDirectory;
- }
-
- public static void debug(final DebugString debug) {
- debug.appendTitle("Image Lookup");
- debug.indent();
- final Iterator keys = images.keySet().iterator();
- while (keys.hasNext()) {
- final Object key = keys.next();
- final Object value = images.get(key);
- debug.appendln(key + " -> " + value);
- }
- debug.unindent();
- }
-
- private static String imageFile(final String imageName, final String contextPath) {
- for (final String element : EXTENSIONS) {
- URL resource;
- try {
- final String imagePath = imageDirectory + imageName + "." + element;
- resource = context.getResource(imagePath);
- if (resource != null) {
- LOG.debug("image found at " + contextPath + imagePath);
- return contextPath + imagePath;
- }
- final URL onClasspath = ImageLookup.class.getResource(imagePath);
- if (onClasspath != null) {
- LOG.debug("image found on classpath " + onClasspath);
- return contextPath + imagePath;
- }
- } catch (final MalformedURLException ignore) {
- }
- }
- return null;
- }
-
- private static String findImage(final ObjectSpecification specification, final String contextPath) {
- String path = findImageFor(specification, contextPath);
- if (path == null) {
- path = imageFile(UNKNOWN_IMAGE, contextPath);
- }
- return path;
- }
-
- private static String findImageFor(final ObjectSpecification specification, final String contextPath) {
- final String name = specification.getShortIdentifier();
- final String fileName = imageFile(name, contextPath);
- if (fileName != null) {
- images.put(name, fileName);
- return fileName;
- } else {
- for (final ObjectSpecification interfaceSpec : specification.interfaces()) {
- final String path = findImageFor(interfaceSpec, contextPath);
- if (path != null) {
- return path;
- }
- }
- final ObjectSpecification superclass = specification.superclass();
- if (superclass != null) {
- return findImageFor(superclass, contextPath);
- } else {
- return null;
- }
- }
- }
-
- /**
- * For an object, the icon name from the object is return if it is not null,
- * otherwise the specification is used to look up a suitable image name.
- *
- * @param contextPath
- *
- * @see ObjectAdapter#getIconName()
- * @see #imagePath(ObjectSpecification)
- */
- /*
- * public static String imagePath(ObjectAdapter object) { String iconName =
- * object.getIconName(); if (iconName != null) { return imagePath(iconName);
- * } else { return imagePath(object.getSpecification()); } }
- */
- public static String imagePath(final ObjectSpecification specification, final String contextPath) {
- final String name = specification.getShortIdentifier();
- final String imageName = (String) images.get(name);
- if (imageName != null) {
- return imageName;
- } else {
- return findImage(specification, contextPath);
- }
- }
-
- /*
- * public static String imagePath(String name) { String imageName = (String)
- * images.get(name); if (imageName != null) { return (String) imageName; }
- * else { String fileName = imageFile(name); return fileName == null ?
- * unknownImageFile : fileName; } }
- */
-
- public static String imagePath(final ObjectAdapter object, final String contextPath) {
- final String name = object.getIconName();
- final String imageName = (String) images.get(name);
- if (imageName != null) {
- return imageName;
- } else {
- final String imageFile = imageFile(name, contextPath);
- if (imageFile != null) {
- return imageFile;
- } else {
- return findImage(object.getSpecification(), contextPath);
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ServletRequestContext.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ServletRequestContext.java b/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ServletRequestContext.java
deleted file mode 100644
index 9b01b60..0000000
--- a/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ServletRequestContext.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.servlet;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.net.MalformedURLException;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.viewer.scimpi.dispatcher.DispatchException;
-import org.apache.isis.viewer.scimpi.dispatcher.ErrorCollator;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiNotFoundException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsers;
-
-public class ServletRequestContext extends RequestContext {
- private HttpServletRequest request;
- private HttpServletResponse response;
- private ServletContext servletContext;
- private boolean isAborted;
-
- public ServletRequestContext(final DebugUsers debugUsers) {
- super(debugUsers);
- }
-
- public void append(final DebugBuilder view) {
- super.append(view);
-
- /*
- * view.divider("System"); Runtime.getRuntime().
- */
- view.startSection("HTTP Serviet Request");
- view.appendTitle("General");
- view.appendln("Auth type", request.getAuthType());
- view.appendln("Character encoding", request.getCharacterEncoding());
- view.appendln("Class", request.getClass());
- view.appendln("Content type", request.getContentType());
- view.appendln("Context path", getContextPath());
- view.appendln("Locale", request.getLocale());
- view.appendln("Method", request.getMethod());
- view.appendln("Path info", request.getPathInfo());
- view.appendln("Path translated", request.getPathTranslated());
- view.appendln("Protocol", request.getProtocol());
- view.appendln("Query string", request.getQueryString());
- view.appendln("Remote host", request.getRemoteHost());
- view.appendln("Remote user", request.getRemoteUser());
- view.appendln("Real path", servletContext.getRealPath("/"));
- view.appendln("Scheme", request.getScheme());
- view.appendln("Server name", request.getServerName());
- view.appendln("Servlet path", request.getServletPath());
- view.appendln("Session", request.getSession());
- view.appendln("Session ID", request.getRequestedSessionId());
- view.appendln("URI", request.getRequestURI());
- view.appendln("URL", request.getRequestURL());
- view.appendln("User principle", request.getUserPrincipal());
-
-
- final Cookie[] cookies = request.getCookies();
- if (cookies != null) {
- view.appendTitle("Cookies");
- for (final Cookie cookie : cookies) {
- view.appendln(cookie.getName(), cookie.getValue());
- }
- }
-
- final Enumeration attributeNames = request.getAttributeNames();
- if (attributeNames.hasMoreElements()) {
- view.appendTitle("Attributes");
- while (attributeNames.hasMoreElements()) {
- final String name = (String) attributeNames.nextElement();
- view.appendln(name, request.getAttribute(name));
- }
- }
-
- view.appendTitle("Headers");
- final Enumeration headerNames = request.getHeaderNames();
- while (headerNames.hasMoreElements()) {
- final String name = (String) headerNames.nextElement();
- view.appendln(name, request.getHeader(name));
- }
-
- view.appendTitle("Parameters");
- final Enumeration parameterNames = request.getParameterNames();
- while (parameterNames.hasMoreElements()) {
- final String name = (String) parameterNames.nextElement();
- view.appendln(name, request.getParameter(name));
- }
-
- view.appendTitle("Servlet Context");
- final ServletContext context = getServletContext();
- view.appendln("Name", context.getServletContextName());
- view.appendln("Server Info", context.getServerInfo());
- view.appendln("Version", context.getMajorVersion() + "." + context.getMinorVersion());
- view.appendln("Attributes", getAttributes(context));
- view.appendln("Init parameters", getParameters(context));
- view.appendln("Real path", context.getRealPath("/"));
- }
-
- private String getAttributes(final ServletContext context) {
- final StringBuffer buf = new StringBuffer();
- final Enumeration names = context.getAttributeNames();
- while (names.hasMoreElements()) {
- final String name = (String) names.nextElement();
- buf.append(name + "=" + context.getAttribute(name));
- }
- return buf.toString();
- }
-
- private String getParameters(final ServletContext context) {
- final StringBuffer buf = new StringBuffer();
- final Enumeration names = context.getInitParameterNames();
- while (names.hasMoreElements()) {
- final String name = (String) names.nextElement();
- buf.append(name + "=" + context.getInitParameter(name));
- }
- return buf.toString();
- }
-
- public void startRequest(final HttpServletRequest request, final HttpServletResponse response, final ServletContext servletContext) {
- this.request = request;
- this.response = response;
- this.servletContext = servletContext;
- final Enumeration parameterNames = request.getParameterNames();
- while (parameterNames.hasMoreElements()) {
- final String name = (String) parameterNames.nextElement();
- addParameter(name, request.getParameter(name));
- }
- initSession();
- }
-
- public HttpServletRequest getRequest() {
- return request;
- }
-
- public HttpServletResponse getResponse() {
- return response;
- }
-
- public ServletContext getServletContext() {
- return servletContext;
- }
-
- @Override
- public PrintWriter getWriter() {
- try {
- return response.getWriter();
- } catch (final IOException e) {
- throw new ScimpiException(e);
- }
- }
-
- @Override
- public String findFile(final String fileName) {
- try {
- if (getServletContext().getResource(fileName) == null) {
- return null;
- } else {
- return fileName;
- }
- } catch (final MalformedURLException e) {
- throw new ScimpiException(e);
- }
- }
-
- @Override
- public String getErrorDetails() {
- return (String) getRequest().getAttribute("com.planchaser.error.details");
- }
-
- @Override
- public String getErrorMessage() {
- return (String) getRequest().getAttribute("com.planchaser.error.message");
- }
-
- @Override
- public String getErrorReference() {
- return (String) getRequest().getAttribute("com.planchaser.error.reference");
- }
-
- @Override
- public InputStream openStream(final String path) {
- final InputStream in = servletContext.getResourceAsStream(path);
-
- if (in == null) {
- servletContext.getResourcePaths("/");
- try {
- servletContext.getResource(path);
- } catch (final MalformedURLException e) {
- throw new ScimpiException(e);
- }
-
- throw new ScimpiNotFoundException("Cannot find file " + path);
- }
- return in;
- }
-
- @Override
- public void startHttpSession() {
- addVariable("_auth_session", getSession(), Scope.SESSION);
- }
-
- private void initSession(){
- final HttpSession httpSession = request.getSession(true);
- // TODO when using version 3.0 of Servlet API use the HttpOnly setting for improved security
- if (httpSession.getAttribute("scimpi-context") == null) {
- final Map<String, Object> sessionData = getSessionData();
- httpSession.setAttribute("scimpi-context", sessionData);
- } else {
- final HashMap<String, Object> data = (HashMap<String, Object>) httpSession.getAttribute("scimpi-context");
- if (data != null) {
- setSessionData(data);
- }
- }
- }
-
- @Override
- protected String getSessionId() {
- return request.getSession().getId();
- }
-
- @Override
- public String clearSession() {
- request.getSession().invalidate();
- return null;
- }
-
- @Override
- public void reset() {
- try {
- response.getWriter().print("<h1>RESET</h1>");
- } catch (final IOException e) {
- throw new DispatchException(e);
- }
- response.reset();
- }
-
- @Override
- public void forward(final String view) {
- try {
- isAborted = true;
- getRequest().getRequestDispatcher(view).forward(getRequest(), getResponse());
- } catch (final IOException e) {
- throw new DispatchException(e);
- } catch (final ServletException e) {
- throw new DispatchException(e);
- }
- }
-
- @Override
- public void redirectTo(final String view) {
- try {
- isAborted = true;
- getResponse().sendRedirect(view);
- } catch (final IOException e) {
- throw new DispatchException(e);
- }
- }
-
- @Override
- public void raiseError(final int status, final ErrorCollator errorDetails) {
- try {
- isAborted = true;
- getRequest().setAttribute("com.planchaser.error.reference", errorDetails.getReference());
- getRequest().setAttribute("com.planchaser.error.message", errorDetails.getMessage());
- getRequest().setAttribute("com.planchaser.error.details", errorDetails.getDetails());
- getResponse().sendError(status);
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public boolean isAborted() {
- return isAborted;
- }
-
- @Override
- public void setContentType(final String string) {
- getResponse().setContentType(string);
- }
-
- @Override
- public String imagePath(final ObjectAdapter object) {
- final String contextPath = getContextPath();
- return ImageLookup.imagePath(object, contextPath);
- }
-
- @Override
- public String imagePath(final ObjectSpecification specification) {
- final String contextPath = getContextPath();
- return ImageLookup.imagePath(specification, contextPath);
- }
-
- @Override
- public String getContextPath() {
- return request.getContextPath();
- }
-
- @Override
- public String getHeader(final String name) {
- return request.getHeader(name);
- }
-
- @Override
- public String getQueryString() {
- return request.getQueryString();
- }
-
- @Override
- public String getUri() {
- return request.getRequestURI() + "?" + request.getQueryString();
- }
-
- @Override
- public String getUrlBase() {
- // return request.getScheme() + request.getServerName() +
- // request.getServerPort();
- final StringBuffer url = request.getRequestURL();
- url.setLength(url.length() - request.getRequestURI().length());
- return url.toString();
- }
-
- @Override
- public void addCookie(final String name, final String value, final int minutesUtilExpires) {
- final Cookie cookie = new Cookie(name, value);
- cookie.setMaxAge(minutesUtilExpires * 60);
- response.addCookie(cookie);
- }
-
- @Override
- public String getCookie(final String name) {
- final Cookie[] cookies = request.getCookies();
- if (cookies != null) {
- for (final Cookie cookie : cookies) {
- if (cookie.getName().equals(name)) {
- return cookie.getValue();
- }
- }
- }
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/src/main/appended-resources/supplemental-models.xml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/src/main/appended-resources/supplemental-models.xml b/component/viewer/scimpi/src/main/appended-resources/supplemental-models.xml
deleted file mode 100644
index ecd3906..0000000
--- a/component/viewer/scimpi/src/main/appended-resources/supplemental-models.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
- license agreements. See the NOTICE file distributed with this work for additional
- information regarding copyright ownership. The ASF licenses this file to
- you under the Apache License, Version 2.0 (the "License"); you may not use
- this file except in compliance with the License. You may obtain a copy of
- the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
- by applicable law or agreed to in writing, software distributed under the
- License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
- OF ANY KIND, either express or implied. See the License for the specific
- language governing permissions and limitations under the License. -->
-<supplementalDataModels xmlns="http://maven.apache.org/supplemental-model/1.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/supplemental-model/1.0.0 http://maven.apache.org/xsd/supplemental-model-1.0.0.xsd">
-
- <supplement>
- <project>
- <groupId>aopalliance</groupId>
- <artifactId>aopalliance</artifactId>
- <version>1.0</version>
- <licenses>
- <license>
- <name>Public Domain</name>
- </license>
- </licenses>
- </project>
- </supplement>
-
- <supplement>
- <!-- not quite sure why licenses:download-license flags this, since license info seems to be in its POM -->
- <project>
- <groupId>org.datanucleus</groupId>
- <artifactId>datanucleus-jodatime</artifactId>
- <version>3.1.1</version>
- <licenses>
- <license>
- <name>The Apache Software License, Version 2.0</name>
- <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
- </license>
- </licenses>
- </project>
- </supplement>
-
- <supplement>
- <project>
- <groupId>org.scannotation</groupId>
- <artifactId>scannotation</artifactId>
- <version>1.0.3</version>
- <licenses>
- <license>
- <name>The Apache Software License, Version 2.0</name>
- <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
- <distribution>repo</distribution>
- </license>
- </licenses>
- </project>
- </supplement>
-
- <supplement>
- <project>
- <groupId>dom4j</groupId>
- <artifactId>dom4j</artifactId>
- <version>1.6.1</version>
- <licenses>
- <license>
- <name>BSD License</name>
- <url>http://dom4j.sourceforge.net/dom4j-1.6.1/license.html</url>
- <distribution>repo</distribution>
- </license>
- </licenses>
- </project>
- </supplement>
-
- <supplement>
- <project>
- <groupId>net.jcip</groupId>
- <artifactId>jcip-annotations</artifactId>
- <version>1.0</version>
- <licenses>
- <license>
- <name>Creative Commons Attribution 2.5 License</name>
- <url>http://creativecommons.org/licenses/by/2.5/</url>
- <distribution>repo</distribution>
- </license>
- </licenses>
- </project>
- </supplement>
-
-
- <supplement>
- <project>
- <groupId>xalan</groupId>
- <artifactId>xalan</artifactId>
- <version>2.7.0</version>
- <licenses>
- <license>
- <name>The Apache Software License, Version 2.0</name>
- <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
- <distribution>repo</distribution>
- </license>
- </licenses>
- </project>
- </supplement>
-
-
-</supplementalDataModels>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/pom.xml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/pom.xml b/component/viewer/scimpi/tck/pom.xml
deleted file mode 100644
index 0c71d86..0000000
--- a/component/viewer/scimpi/tck/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.isis.tck</groupId>
- <artifactId>isis-tck</artifactId>
- <version>1.9.0-SNAPSHOT</version>
- <relativePath>../../../../tck/pom.xml</relativePath>
- </parent>
-
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-scimpi-tck</artifactId>
- <name>Isis Scimpi Viewer TCK tests</name>
-
- <properties>
- <isis-viewer-scimpi.version>1.0.0-SNAPSHOT</isis-viewer-scimpi.version>
- <isis-objectstore-xml.version>1.0.0-SNAPSHOT</isis-objectstore-xml.version>
- <isis-profilestore-xml.version>1.0.0-SNAPSHOT</isis-profilestore-xml.version>
- <isis-security-file.version>1.6.0-SNAPSHOT</isis-security-file.version>
-
- <siteBaseDir>..</siteBaseDir>
- <relativeUrl>scimpi-tck/</relativeUrl>
- <!-- until someone comes up with a better solution -->
- <distMgmtSiteUrl>file:///tmp/m2-sites/isis/viewer/scimpi</distMgmtSiteUrl>
- </properties>
-
- <packaging>war</packaging>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>maven-jetty-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- <dependencies>
-
- <!-- other modules in this project -->
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-tck-dom</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-tck-fixture</artifactId>
- </dependency>
-
-
- <!-- isis non-core components -->
- <dependency>
- <groupId>org.apache.isis.viewer</groupId>
- <artifactId>isis-viewer-scimpi-servlet</artifactId>
- <version>${isis-viewer-scimpi.version}</version>
- </dependency>
-
-
- <!-- isis runtime -->
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-runtime</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-security</artifactId>
- </dependency>
-
- <!-- to run using WebServer -->
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-webserver</artifactId>
- <scope>runtime</scope>
- <optional>true</optional>
- </dependency>
-
- </dependencies>
-
-</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/resources/images/Default.png
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/resources/images/Default.png b/component/viewer/scimpi/tck/src/main/resources/images/Default.png
deleted file mode 100644
index 8409e46..0000000
Binary files a/component/viewer/scimpi/tck/src/main/resources/images/Default.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/edit-selector.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/edit-selector.shtml b/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/edit-selector.shtml
deleted file mode 100644
index 724ac7a..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/edit-selector.shtml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title>Edit <swf:title icon="no" /></swf:page-title>
-<swf:template file="../style/template.shtml" />
-
-<h2>Edit <swf:title /></h2>
-<swf:edit>
- <swf:selector field="claimant" object="service:claimants" method="findEmployees" title="Employees..."/>
- <swf:selector field="approver" object="service:claimants" method="findEmployees" title="Employees..."/>
-</swf:edit>
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-link.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-link.shtml b/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-link.shtml
deleted file mode 100644
index 406f42c..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-link.shtml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title><swf:title icon="no" /></swf:page-title>
-<swf:template file="../style/template.shtml" />
-
-<h2><swf:title /></h2>
-<swf:short-form>
- <swf:link name="claimant"/>
-</swf:short-form>
-
-<swf:methods/>
-
-
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-orig.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-orig.shtml b/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-orig.shtml
deleted file mode 100644
index deb6d66..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object-orig.shtml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title><swf:title icon="no" /></swf:page-title>
-<swf:template file="../style/template.shtml" />
-
-<h2><swf:title /></h2>
-
-<swf:long-form />
-
-<swf:methods />
-
-
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object.shtml b/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object.shtml
deleted file mode 100644
index f1865ce..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object.shtml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title><swf:title icon="no" /></swf:page-title>
-<swf:template file="../style/template.shtml" />
-
-<h2><swf:title /></h2>
-<swf:short-form>
- <swf:exclude name="approver"/>
-</swf:short-form>
-
-<swf:methods>
- <swf:exclude name="submit"/>
-</swf:methods>
-
-
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object2.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object2.shtml b/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object2.shtml
deleted file mode 100644
index f07c718..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/ToDoItem/object2.shtml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title><swf:title icon="no" /></swf:page-title>
-<swf:template file="../style/template.shtml" />
-
-<h2><swf:title /></h2>
-<swf:short-form>
-</swf:short-form>
-
-<swf:methods>
-</swf:methods>
-
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/isis.properties b/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/isis.properties
deleted file mode 100644
index d8aab34..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/isis.properties
+++ /dev/null
@@ -1,54 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-isis.services.prefix = org.apache.isis.tck.objstore.dflt
-isis.services =\
- scalars.ApplibValuedEntityRepositoryDefault,\
- scalars.JdkValuedEntityRepositoryDefault,\
- scalars.PrimitiveValuedEntityRepositoryDefault,\
- scalars.WrapperValuedEntityRepositoryDefault, \
- simples.SimpleEntityRepositoryDefault,\
- assocs.ParentEntityRepositoryDefault
-
-isis.fixtures.prefix= org.apache.isis.tck.fixture
-isis.fixtures=\
- LogonAsSvenFixture,\
- scalars.ApplibValuedEntityFixture,\
- scalars.JdkValuedEntityFixture,\
- scalars.PrimitiveValuedEntityFixture,\
- scalars.WrapperValuedEntityFixture,\
- simples.SimpleEntityFixture,\
- assocs.ParentAndChildEntityFixture
-
-isis.exploration.users=sven, dick, bob
-
-
-
-isis.persistor.object-factory=org.apache.isis.runtimes.dflt.bytecode.dflt.objectfactory.CglibObjectFactory
-#isis.persistor.object-factory=org.apache.isis.runtimes.dflt.bytecode.javassist.objectfactory.JavassistObjectFactory
-#isis.persistor.object-factory=org.apache.isis.runtimes.dflt.bytecode.identity.objectfactory.ObjectFactoryBasic
-
-
-isis.persistor.domain-object-container=org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault
-#isis.persistor.domain-object-container=org.apache.isis.progmodel.wrapper.metamodel.DomainObjectContainerWrapperFactory
-
-
-#isis.reflector.facets.include=org.apache.isis.runtimes.dflt.runtime.authorization.standard.AuthorizationFacetFactoryImpl
-#isis.authorization.learn=true
-
-
-isis.persistor=in-memory
-#isis.xmlos.dir=/tmp/xml
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/logging.properties
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/logging.properties b/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/logging.properties
deleted file mode 100644
index f2d65e6..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/logging.properties
+++ /dev/null
@@ -1,30 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# apache's log4j is used to provide system logging.
-log4j.rootCategory=INFO, Console
-
-# The console appender
-log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.target=System.out
-log4j.appender.Console.layout=org.apache.log4j.PatternLayout
-log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n
-
-log4j.appender.File=org.apache.log4j.RollingFileAppender
-log4j.appender.File.file=isis.log
-log4j.appender.File.append=false
-log4j.appender.File.layout=org.apache.log4j.PatternLayout
-log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p] %m%n
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.allow
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.allow b/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.allow
deleted file mode 100644
index 928983a..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.allow
+++ /dev/null
@@ -1,16 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.passwords
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.passwords b/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.passwords
deleted file mode 100644
index 7f07af5..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/security_file.passwords
+++ /dev/null
@@ -1,20 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-sven:pass
-dick:pass
-bob:pass
-joe:pass
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/web.xml b/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 3e61f54..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<web-app id="WebApp_ID" version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
-
- <display-name>Apache Isis S Viewer</display-name>
-
- <welcome-file-list>
- <welcome-file>index.shtml</welcome-file>
- </welcome-file-list>
-
- <listener>
- <listener-class>org.apache.isis.core.webapp.IsisWebAppBootstrapper</listener-class>
- </listener>
-
- <context-param>
- <param-name>isis.viewers</param-name>
- <param-value>scimpi</param-value>
- </context-param>
-
- <servlet>
- <servlet-name>dispatcher</servlet-name>
- <servlet-class>org.apache.isis.viewer.scimpi.servlet.DispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>dispatcher</servlet-name>
- <url-pattern>*.shtml</url-pattern>
- </servlet-mapping>
-
- <servlet-mapping>
- <servlet-name>dispatcher</servlet-name>
- <url-pattern>*.app</url-pattern>
- </servlet-mapping>
-
-</web-app>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/debug.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/debug.shtml b/component/viewer/scimpi/tck/src/main/webapp/debug.shtml
deleted file mode 100644
index 93550cf..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/debug.shtml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:template file="style/template.shtml"/>
-
-<swf:services/>
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/generic/action.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/generic/action.shtml b/component/viewer/scimpi/tck/src/main/webapp/generic/action.shtml
deleted file mode 100644
index b72bb04..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/generic/action.shtml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title>Action <swf:action-name method="${method}"/></swf:page-title>
-<swf:template file="../style/template.shtml" />
-
-<h2>${title}</h2>
-<swf:action-form method="${method}" view="_generic.shtml"/>
-
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/generic/collection.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/generic/collection.shtml b/component/viewer/scimpi/tck/src/main/webapp/generic/collection.shtml
deleted file mode 100644
index 823046f..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/generic/collection.shtml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title><swf:element-type /> Listing</swf:page-title>
-<swf:template file="../style/template.shtml" />
-
-<h2>${title}</h2>
-<swf:table link="_generic.shtml" />
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/generic/edit.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/generic/edit.shtml b/component/viewer/scimpi/tck/src/main/webapp/generic/edit.shtml
deleted file mode 100644
index 6d47bfc..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/generic/edit.shtml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title>Edit <swf:title icon="no" /></swf:page-title>
-<swf:template file="../style/template.shtml" />
-
-<h2>Edit <swf:title /></h2>
-<swf:edit />
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/generic/object.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/generic/object.shtml b/component/viewer/scimpi/tck/src/main/webapp/generic/object.shtml
deleted file mode 100644
index 18fa5da..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/generic/object.shtml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title><swf:title icon="no" /></swf:page-title>
-<swf:template file="../style/template.shtml" />
-
-<h2><swf:title /></h2>
-<swf:long-form link="_generic.shtml" />
-
-<swf:methods />
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/images/Claim.png
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/images/Claim.png b/component/viewer/scimpi/tck/src/main/webapp/images/Claim.png
deleted file mode 100644
index 478f115..0000000
Binary files a/component/viewer/scimpi/tck/src/main/webapp/images/Claim.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/images/ClaimItem.png
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/images/ClaimItem.png b/component/viewer/scimpi/tck/src/main/webapp/images/ClaimItem.png
deleted file mode 100644
index d85fd82..0000000
Binary files a/component/viewer/scimpi/tck/src/main/webapp/images/ClaimItem.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/images/Employee.png
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/images/Employee.png b/component/viewer/scimpi/tck/src/main/webapp/images/Employee.png
deleted file mode 100644
index 6cf2bd4..0000000
Binary files a/component/viewer/scimpi/tck/src/main/webapp/images/Employee.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/images/banner-bg.png
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/images/banner-bg.png b/component/viewer/scimpi/tck/src/main/webapp/images/banner-bg.png
deleted file mode 100644
index 830e843..0000000
Binary files a/component/viewer/scimpi/tck/src/main/webapp/images/banner-bg.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/images/banner.png
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/images/banner.png b/component/viewer/scimpi/tck/src/main/webapp/images/banner.png
deleted file mode 100644
index f81e331..0000000
Binary files a/component/viewer/scimpi/tck/src/main/webapp/images/banner.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/images/logo.png
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/images/logo.png b/component/viewer/scimpi/tck/src/main/webapp/images/logo.png
deleted file mode 100644
index ea4cbc1..0000000
Binary files a/component/viewer/scimpi/tck/src/main/webapp/images/logo.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/index.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/index.shtml b/component/viewer/scimpi/tck/src/main/webapp/index.shtml
deleted file mode 100644
index e9281cf..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/index.shtml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:page-title>Claims App</swf:page-title>
-
-<swf:template file="style/template.shtml" />
-
-
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/login.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/login.shtml b/component/viewer/scimpi/tck/src/main/webapp/login.shtml
deleted file mode 100644
index a427a54..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/login.shtml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<swf:template file="style/template.shtml" />
-
-<h2>Please Log On</h2>
-<swf:logon/>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/style/screen.css
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/style/screen.css b/component/viewer/scimpi/tck/src/main/webapp/style/screen.css
deleted file mode 100644
index f990946..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/style/screen.css
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-BODY {
- font-family: Arial, Sans-Serif;
- margin: 0 0 10px 0;
- color: black;
- background-color: #f0f0f0;
-}
-
-/*
-* Banner
-*/
-div#banner {
- background-image: url(../images/banner-bg.png);
- background-repeat: repeat-x;
- width: 100%;
- height: 120px;
-}
-
-/*
-* Content below banner
-*/
-div#content {
- display: block;
-}
-
-div#content div#side {
- display: inline;
- float: left;
- width: 150px;
- padding: 25px 10px;
-}
-
-div#side ul {
- margin: 0;
- padding: 0;
-}
-
-div#side li {
- display: block;
- font-size: 80%;
- padding: 4px 0;
-}
-
-div#content div#main{
- padding: 1em;
- float:left;
- width:70%;
-}
-
-/*
-* Feedback area
-*/
-.feedback {
- border: 2px solid red;
- background-color: #ffccff;
- padding: 20px 10px;
-}
-
-.warning {
- color: red;
- font-style: italic;
-}
-
-.message {
- color: blue;
-}
-
-.error {
- color: red;
- font-size: 80%;
- padding-left: 6px;
-}
-
-/*
-* Debug
-*/
-
-div.debug {
- display: block;
- padding: 10px;
- border: 1px solid gray;
- background-color: #ddd;
-}
-
-/*
-* Headings
-*/
-h1, h2, h3, h4 {
- color: blue;
-}
-
-
-/*
-* Hyper links
-*/
-a {
- color: blue;
- text-decoration: none;
-}
-
-a:hover {
- text-decoration: underline;
-}
-
-a:visted {
- color: blue;
- text-decoration: none;
-}
-
-/*
-* Icons
-*/
-img.title-icon {
- height: 32px;
- padding-right: 6px;
-}
-
-img.small-icon {
- height: 16px;
- padding-right: 6px;
- vertical-align: text-bottom;
-}
-
-
-/*
-* Actions
-*/
-div.actions {
-
-}
-
-div.actions div.actions {
- border: 0px;
- padding: 0px;
-}
-
-div.actions h2 {
- font-size: 90%;
-}
-
-div.actions h3 {
- font-size: 80%;
-}
-
-div.actions div.action,
-a.action
-{
- padding 2px;
- margin: 4px 0;
- height: 1.6em;
-}
-
-div.action INPUT,
-div.action a,
-a.action,
-div.action span.disabled
-{
- font-size: 80%;
- background-color: silver;
- border: 1px solid #333399;
- background: url(../images/bg-button.gif);
- background-repeat: repeat-x;
-}
-
-div.action INPUT[type="hidden"]
-{
- background: none;
- border: none;
-}
-
-div.action a,
-a.action,
-div.action span.disabled {
- padding: 1px 10px;
-}
-
-.action INPUT,
-a.action,
-.action a:link {
- color: #000000;
-}
-
-.action INPUT,
-a.action,
-.action a:visited {
- color: #000000;
-}
-
-.action INPUT,
-a.action,
-.action a:hover {
- color: #000000;
- text-decoration: none;
-}
-
-div.action span.disabled {
- color: #555;
-}
-
-/*
-* Edit forms
-*/
-fieldset {
- padding: 5px 10px;
-}
-
-fieldset div.field {
- padding: 4px 0px;
- min-height: 1.3em;
-}
-
-fieldset label {
- float: left;
- width:140px;
- font-weight: bold;
-}
-
-fieldset input {
- padding: 0px 0;
-}
-
-fieldset textarea {
- font-family: Arial, Sans-Serif;
-}
-
-form input.button {
- font-size: 80%;
- background-color: silver;
- border: 1px solid #333399;
- background: url(../images/bg-button.gif);
- background-repeat: repeat-x;
- padding: 1px 0;
-}
-
-/*
-* Display forms
-*/
-div.form {
- padding: 5px 0;
-}
-
-XXdiv.form * {
- border: 1px solid red;
-}
-
-div.form div.field {
- padding: 4px 6px;
- min-height: 1.3em;
-}
-
-div.form div.odd-row {
- background-color: #e7e7e7;
-}
-
-div.form div.even-row {
- background-color: #eee;
-}
-
-div.form span.label {
- float: left;
- font-weight: bold;
-}
-
-div.form span.value {
- display: block;
- padding-left: 12em;
- max-width: 45em;
-}
-
-
-
-/*
-* collections
-*/
-
-#store .entry {
- border-bottom: 1px dotted #7745FF;
- padding: 10px 0;
-}
-
-table {
- border: 0px;
- padding-bottom: 10px;
-}
-
-th {
- background-color: #bbb;
-}
-
-tr.odd-row {
- background-color: #eee;
-}
-
-tr.even-row {
- background-color: #e7e7e7;
-}
-
-td {
- vertical-align: top;
- padding: 4px 10px;
-}
-
-tr:hover {
- border: 1px solid black;
- background-color: #eea;
-}
-
-
-
-
-
-/*
-* Application specific
-*/
-div.book {
- padding-bottom: 10px;
- border-bottom: 2px dashed;
-}
-
-div.cover {
- float: left;
- padding-right: 30px;
- padding-bottom: 8px;
-}
-
-
-.title {
- color: white;
- font-size: 120%;
- font-weight: bold;
- margin-left: 5px;
-}
-
-.description {}
-
-.price {
- display: inline;
- font-weight: bold;
- text-align: left;
- margin-right: 20px;
-}
-
-form, input {
- display: inline;
-}
-
-
-div#cart {
- float: right;
- width: 160px;
- font-size: 70%;
- border: 1px solid gray;
- margin: 10px;
- padding: 10px;
-}
-
-div#cart ul {
- padding: 0;
-
-}
-
-div#cart li {
- display: block;
- padding-bottom: 4px;
-}
-
-
-
-form.selector fieldset {
- margin-left: 45px;
- font-size: 80%;
-}
-
-form.selector legend {
- font-style: italic;
-}
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/tck/src/main/webapp/style/template.shtml
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/tck/src/main/webapp/style/template.shtml b/component/viewer/scimpi/tck/src/main/webapp/style/template.shtml
deleted file mode 100644
index 0774613..0000000
--- a/component/viewer/scimpi/tck/src/main/webapp/style/template.shtml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<title>${title}</title>
-<link rel="stylesheet" title="Style 1" href="${_context}/style/screen.css" type="text/css" media="all" />
-</head>
-
-<body id="demo">
-
-<div id="banner">
- <div class="logo"><img src="images/logo.png"/></div>
- <div class="title">To-Do App</div>
-</div>
-
-<div id="content">
- <div id="side">
- <swf:services />
- </div>
- <div id="main">
- <swf:feedback />
- <swf:content />
-
- <swf:diagnostics/>
- </div>
-</div>
-
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/NOTICE
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/NOTICE b/mothballed/component/viewer/scimpi/NOTICE
new file mode 100644
index 0000000..ba21d0c
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/NOTICE
@@ -0,0 +1,7 @@
+Apache Isis
+Copyright 2010-2013 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/pom.xml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/pom.xml b/mothballed/component/viewer/scimpi/dispatcher/pom.xml
new file mode 100644
index 0000000..3805c10
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/pom.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-scimpi</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>isis-viewer-scimpi-dispatcher</artifactId>
+
+ <name>Isis Scimpi Viewer Dispatcher</name>
+
+ <properties>
+ <siteBaseDir>..</siteBaseDir>
+ <relativeUrl>dispatcher/</relativeUrl>
+ </properties>
+
+ <!-- used in Site generation for relative references. -->
+ <url>http://isis.apache.org/${relativeUrl}</url>
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-project-info-reports-plugin</artifactId>
+ <inherited>false</inherited>
+ <configuration>
+ <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+ </configuration>
+ <reportSets>
+ <reportSet>
+ <inherited>false</inherited>
+ <reports>
+ <report>dependencies</report>
+ <report>dependency-convergence</report>
+ <report>plugins</report>
+ <report>summary</report>
+ </reports>
+ </reportSet>
+ </reportSets>
+ </plugin>
+ </plugins>
+ </reporting>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-runtime</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>dom4j</groupId>
+ <artifactId>dom4j</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.htmlparser</groupId>
+ <artifactId>htmlparser</artifactId>
+ </dependency>
+
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractElementProcessor.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractElementProcessor.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractElementProcessor.java
new file mode 100644
index 0000000..4869cc4
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractElementProcessor.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import org.apache.isis.core.commons.config.ConfigurationConstants;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public abstract class AbstractElementProcessor implements ElementProcessor, Names {
+
+ private static final String SHOW_ICONS_BY_DEFAULT = ConfigurationConstants.ROOT + "scimpi.show-icons";
+
+ private final boolean showIconByDefault;
+
+ public AbstractElementProcessor() {
+ showIconByDefault = IsisContext.getConfiguration().getBoolean(SHOW_ICONS_BY_DEFAULT, false);
+ }
+
+ /**
+ * Return the Class for the class specified in the type attribute.
+ */
+ protected Class<?> forClass(final Request request) {
+ Class<?> cls = null;
+ final String className = request.getOptionalProperty(TYPE);
+ if (className != null) {
+ try {
+ cls = Class.forName(className);
+ } catch (final ClassNotFoundException e) {
+ throw new ScimpiException("No class for " + className, e);
+ }
+ }
+ return cls;
+ }
+
+ protected boolean showIconByDefault() {
+ return showIconByDefault;
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
new file mode 100644
index 0000000..97dd1ed
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public abstract class AbstractObjectProcessor extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String id = request.getOptionalProperty(OBJECT);
+ ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+
+ final String field = request.getOptionalProperty(FIELD);
+ if (field != null) {
+ final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
+ final String error = checkFieldType(objectField);
+ if (error != null) {
+ throw new ScimpiException("Field " + objectField.getId() + " " + error);
+ }
+ ResolveFieldUtil.resolveField(object, objectField);
+ object = objectField.get(object);
+ }
+
+ process(request, object);
+ }
+
+ protected String checkFieldType(final ObjectAssociation objectField) {
+ return null;
+ }
+
+ protected abstract void process(Request request, ObjectAdapter object);
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Action.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Action.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Action.java
new file mode 100644
index 0000000..7bd6b26
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/Action.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+import java.io.IOException;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+
+public interface Action extends Names {
+
+ void process(RequestContext context) throws IOException;
+
+ String getName();
+
+ void init();
+
+ void debug(DebugBuilder debug);
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/BlockContent.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/BlockContent.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/BlockContent.java
new file mode 100644
index 0000000..836ae60
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/BlockContent.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+public interface BlockContent {
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/DispatchException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/DispatchException.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/DispatchException.java
new file mode 100644
index 0000000..cc679ae
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/DispatchException.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher;
+
+public class DispatchException extends ScimpiException {
+ private static final long serialVersionUID = 1L;
+
+ public DispatchException() {
+ }
+
+ public DispatchException(final String message) {
+ super(message);
+ }
+
+ public DispatchException(final Throwable cause) {
+ super(cause);
+ }
+
+ public DispatchException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+}
[33/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.ttf
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.ttf b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..5cd6cff
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.ttf differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.woff
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.woff b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..9eaecb3
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.woff differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/gh-fork-ribbon.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/gh-fork-ribbon.css b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/gh-fork-ribbon.css
new file mode 100644
index 0000000..5806121
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/gh-fork-ribbon.css
@@ -0,0 +1,140 @@
+/*!
+ * "Fork me on GitHub" CSS ribbon v0.1.1 | MIT License
+ * https://github.com/simonwhitaker/github-fork-ribbon-css
+*/
+
+/* Left will inherit from right (so we don't need to duplicate code) */
+.github-fork-ribbon {
+ /* The right and left classes determine the side we attach our banner to */
+ position: absolute;
+
+ /* Add a bit of padding to give some substance outside the "stitching" */
+ padding: 2px 0;
+
+ /* Set the base colour */
+ background-color: #a00;
+
+ /* Set a gradient: transparent black at the top to almost-transparent black at the bottom */
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.15)));
+ background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+ background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+ background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+ background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+ background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+
+ /* Add a drop shadow */
+ -webkit-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5);
+ -moz-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5);
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5);
+
+ /* Set the font */
+ font: 700 13px "Helvetica Neue", Helvetica, Arial, sans-serif;
+
+ z-index: 9999;
+ pointer-events: auto;
+}
+
+.github-fork-ribbon a,
+.github-fork-ribbon a:hover {
+ /* Set the text properties */
+ color: #fff;
+ text-decoration: none;
+ text-shadow: 0 -1px rgba(0, 0, 0, 0.5);
+ text-align: center;
+
+ /* Set the geometry. If you fiddle with these you'll also need
+ to tweak the top and right values in .github-fork-ribbon. */
+ width: 200px;
+ line-height: 20px;
+
+ /* Set the layout properties */
+ display: inline-block;
+ padding: 2px 0;
+
+ /* Add "stitching" effect */
+ border-width: 1px 0;
+ border-style: dotted;
+ border-color: #fff;
+ border-color: rgba(255, 255, 255, 0.7);
+}
+
+.github-fork-ribbon-wrapper {
+ width: 150px;
+ height: 150px;
+ position: absolute;
+ overflow: hidden;
+ top: 0;
+ z-index: 9999;
+ pointer-events: none;
+}
+
+.github-fork-ribbon-wrapper.fixed {
+ position: fixed;
+}
+
+.github-fork-ribbon-wrapper.left {
+ left: 0;
+}
+
+.github-fork-ribbon-wrapper.right {
+ right: 0;
+}
+
+.github-fork-ribbon-wrapper.left-bottom {
+ position: fixed;
+ top: inherit;
+ bottom: 0;
+ left: 0;
+}
+
+.github-fork-ribbon-wrapper.right-bottom {
+ position: fixed;
+ top: inherit;
+ bottom: 0;
+ right: 0;
+}
+
+.github-fork-ribbon-wrapper.right .github-fork-ribbon {
+ top: 42px;
+ right: -43px;
+
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+
+.github-fork-ribbon-wrapper.left .github-fork-ribbon {
+ top: 42px;
+ left: -43px;
+
+ -webkit-transform: rotate(-45deg);
+ -moz-transform: rotate(-45deg);
+ -ms-transform: rotate(-45deg);
+ -o-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+}
+
+
+.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon {
+ top: 80px;
+ left: -43px;
+
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+
+.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon {
+ top: 80px;
+ right: -43px;
+
+ -webkit-transform: rotate(-45deg);
+ -moz-transform: rotate(-45deg);
+ -ms-transform: rotate(-45deg);
+ -o-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/images/maze-black.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/images/maze-black.png b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/images/maze-black.png
new file mode 100644
index 0000000..99a49c2
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/images/maze-black.png differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif b/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif
new file mode 100644
index 0000000..75e3b1e
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif differ
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy-white.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy-white.css b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy-white.css
new file mode 100644
index 0000000..c48f614
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy-white.css
@@ -0,0 +1,698 @@
+@-webkit-keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 25% {
+ opacity: .3;
+ }
+
+ 50% {
+ opacity: .66;
+ }
+
+ 75% {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 25% {
+ opacity: .3;
+ }
+
+ 50% {
+ opacity: .66;
+ }
+
+ 75% {
+ opacity: 1;
+ }
+}
+
+@-webkit-keyframes pulse {
+ 0% {
+ text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
+ }
+
+ 25% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
+ }
+
+ 50% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
+ }
+
+ 75% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
+ }
+}
+
+@keyframes pulse {
+ 0% {
+ text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
+ }
+
+ 25% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
+ }
+
+ 50% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
+ }
+
+ 75% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
+ }
+}
+
+@-webkit-keyframes slide-in {
+ 0% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+}
+
+@keyframes slide-in {
+ 0% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+}
+
+@-webkit-keyframes slide-out {
+ 0% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+}
+
+@keyframes slide-out {
+ 100% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+}
+
+svg {
+ background: white;
+ position: absolute;
+ left: 0;
+ cursor: -webkit-grab;
+ height: 100%;
+ width: 100%;
+ color: #333;
+}
+
+.edge path {
+ fill: none;
+}
+
+.edge .edge-handler {
+ stroke: transparent;
+ fill: none;
+}
+
+.edge text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+}
+
+.edge.active text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+}
+
+.edge.active:hover,
+.edge.active.selected {
+ cursor: pointer;
+}
+
+.edge.active:hover text,
+.edge.active.selected text {
+ display: block;
+}
+
+#zoom-controls {
+ background-color: rgba(0,0,0,0.3);
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ box-shadow: 0 0 5px rgba(255,255,255,0.3);
+ margin-top: 10%;
+ z-index: 5;
+ position: relative;
+ display: block;
+ width: 55px;
+}
+
+#zoom-controls #zoom-in,
+#zoom-controls #zoom-out,
+#zoom-controls #zoom-reset {
+ padding: 12px;
+ margin: 0;
+ width: 100%;
+}
+
+#zoom-controls #zoom-in i,
+#zoom-controls #zoom-out i,
+#zoom-controls #zoom-reset i {
+ color: #E89619;
+}
+
+#zoom-controls #zoom-in:hover,
+#zoom-controls #zoom-out:hover,
+#zoom-controls #zoom-reset:hover {
+ background-color: rgba(255,255,255,0.2);
+}
+
+#zoom-controls #zoom-in:active,
+#zoom-controls #zoom-out:active,
+#zoom-controls #zoom-reset:active {
+ border: none;
+}
+
+.fa-caret-right,
+.fa-caret-down {
+ margin: 0 5px;
+ color: #68b9fe;
+}
+
+#search {
+ margin-top: 2em;
+ margin-bottom: 1em;
+ padding: .5em 1em;
+ width: 100%;
+}
+
+#search span {
+ vertical-align: bottom;
+}
+
+#search input {
+ background-color: transparent;
+ border: thin dashed #68B9FE;
+ font-size: 20px;
+ padding-left: 0.5em;
+ margin-top: -1px;
+}
+
+#search input::-webkit-input-placeholder {
+ color: white;
+}
+
+#search input:-moz-placeholder {
+ color: white;
+}
+
+#search input::-moz-placeholder {
+ color: white;
+}
+
+#search input:-ms-input-placeholder {
+ color: white;
+}
+
+#search .search-icon {
+ height: 22px;
+ background-color: transparent;
+ border: thin dashed #68B9FE;
+ color: white;
+}
+
+#stats {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #68b9fe;
+}
+
+#stats #stats-header {
+ padding: 10px;
+}
+
+#stats #all-stats {
+ color: white;
+ border-radius: none;
+ border: none;
+ background: transparent;
+ overflow: auto;
+}
+
+#stats #all-stats li {
+ padding: 3px;
+}
+
+#stats #node-stats-graph,
+#stats #edge-stats-graph {
+ height: 250px;
+}
+
+#stats #node-stats-graph svg,
+#stats #edge-stats-graph svg {
+ opacity: .6;
+ background: transparent;
+}
+
+#stats #node-stats-graph text,
+#stats #edge-stats-graph text {
+ font-size: 16px;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+}
+
+#stats #node-stats-graph .no-data,
+#stats #edge-stats-graph .no-data {
+ margin: 30px 0;
+ color: #68b9fe;
+}
+
+#stats .badge {
+ border-radius: 0;
+ height: 100%;
+ background-color: rgba(104,185,254,0.6);
+}
+
+#editor {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #68b9fe;
+}
+
+#editor h3 {
+ padding: 10px;
+}
+
+#editor #element-options {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+ cursor: pointer;
+ margin-top: 10px;
+ margin-left: 2%;
+ color: white;
+}
+
+#editor #element-options .node-property,
+#editor #element-options #node-add-property {
+ display: -webkit-inline-flex;
+ display: inline-flex;
+ margin: 4px 0;
+ width: 100%;
+}
+
+#editor #element-options .property-value,
+#editor #element-options #node-add-property #add-property #node-add-prop-value {
+ border: thin rgba(255,255,255,0.2) solid;
+ border-left: none;
+ background-color: black;
+ color: white;
+ width: 100%;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+#editor #element-options .property-name,
+#editor #element-options #node-add-property #add-property #node-add-prop-key {
+ text-align: center;
+ font-weight: 200;
+ cursor: default;
+ background: #2E2E2E;
+ border: thin transparent solid;
+ color: #68b9fe;
+ border-right: none;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+#editor #element-options #node-add-property #add-property {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-grow: 2;
+ flex-grow: 2;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+}
+
+#editor #element-options #node-add-property #add-property #node-add-prop-value {
+ text-align: center;
+ width: 100%;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 4px;
+ border: thin rgba(255,255,255,0.2) solid;
+}
+
+#editor #element-options #node-add-property #add-property #node-add-prop-key {
+ cursor: text;
+ width: 100%;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 0;
+}
+
+#editor #element-options input[type="submit"],
+#editor #element-options #update-properties {
+ color: #68b9fe;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ width: auto;
+ background: rgba(255,255,255,0.1);
+ border: thin solid #68b9fe;
+ text-align: center;
+}
+
+#editor #element-options input[type="submit"]:active,
+#editor #element-options #update-properties:active,
+#editor #element-options input[type="submit"]:focus,
+#editor #element-options #update-properties:focus {
+ outline: none;
+}
+
+#editor #element-options input[type="submit"]:hover,
+#editor #element-options #update-properties:hover {
+ color: white;
+ border: thin solid white;
+}
+
+#editor #element-options #update-properties {
+ border-radius: 4px;
+ padding: 10px;
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+#editor #editor-interactions.active {
+ color: #68b9fe;
+}
+
+#editor #editor-interactions.inactive {
+ color: white;
+}
+
+#editor #node-editor.enabled {
+ -webkit-animation: fadeIn 1s linear;
+ animation: fadeIn 1s linear;
+}
+
+#control-dash-wrapper {
+ font-family: 'Source Sans Pro', Helvetica, sans-serif;
+ letter-spacing: .05em;
+ height: inherit;
+ z-index: inherit;
+ padding: 0;
+}
+
+#control-dash-wrapper.initial {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+}
+
+#control-dash-wrapper.initial #dash-toggle {
+ color: #68b9fe;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper.off-canvas {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ -webkit-animation: slide-out .75s linear;
+ animation: slide-out .75s linear;
+}
+
+#control-dash-wrapper.off-canvas #dash-toggle {
+ color: #68b9fe;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper.on-canvas {
+ -webkit-animation: slide-in .75s ease-in-out;
+ animation: slide-in .75s ease-in-out;
+}
+
+#control-dash-wrapper.on-canvas * {
+ box-shadow: none !important;
+}
+
+#control-dash-wrapper.on-canvas #dash-toggle {
+ color: rgba(104,185,254,0.6);
+}
+
+#control-dash-wrapper.on-canvas #dash-toggle:hover {
+ color: #68b9fe;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper #control-dash {
+ overflow-x: hidden;
+ overflow-y: scroll;
+ background-color: rgba(0,0,0,0.3);
+ padding: 0;
+ height: inherit;
+ z-index: 5;
+}
+
+#control-dash-wrapper #control-dash h3 {
+ display: inline;
+ margin: 0;
+}
+
+#control-dash-wrapper #dash-toggle {
+ z-index: 5;
+ background-color: rgba(0,0,0,0.3);
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ box-shadow: 0 0 5px rgba(255,255,255,0.3);
+ position: absolute;
+ left: 0;
+ top: 50%;
+ font-size: 2.2em;
+ color: rgba(255,255,255,0.2);
+ padding: 10px;
+}
+
+#control-dash-wrapper button {
+ border-radius: 0;
+ border: none;
+ background-color: transparent;
+}
+
+#control-dash-wrapper button:active {
+ border: none;
+}
+
+#control-dash-wrapper h3 {
+ font-weight: 200;
+ margin-top: 10px;
+ color: white;
+ cursor: pointer;
+ vertical-align: top;
+}
+
+#control-dash-wrapper li {
+ cursor: pointer;
+ background: transparent;
+ border: none;
+ border-radius: 0;
+}
+
+.node {
+ cursor: pointer;
+}
+
+.node text.root {
+ font-size: 32px;
+}
+
+.node text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+}
+
+.node.active {
+ opacity: 1;
+}
+
+.node.active.selected text {
+ display: block;
+}
+
+.node.active:hover text {
+ display: block;
+}
+
+#filters {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #68b9fe;
+ color: white;
+}
+
+#filters form {
+ width: 100%;
+}
+
+#filters #filter-header {
+ padding: 10px;
+}
+
+#filters #filter-relationships,
+#filters #filter-nodes {
+ background-color: transparent;
+ display: inline-block;
+ width: 45%;
+ margin-left: 2%;
+ overflow: auto;
+ text-align: center;
+ vertical-align: top;
+}
+
+#filters #filter-relationships #filter-node-header,
+#filters #filter-relationships #filter-rel-header,
+#filters #filter-nodes #filter-node-header,
+#filters #filter-nodes #filter-rel-header {
+ margin: 10px 0;
+ cursor: pointer;
+ background-color: transparent;
+ border: none;
+ border-radius: 0;
+ width: 100%;
+}
+
+#filters #filter-relationships #filter-node-header h4,
+#filters #filter-relationships #filter-rel-header h4,
+#filters #filter-nodes #filter-node-header h4,
+#filters #filter-nodes #filter-rel-header h4 {
+ font-weight: 200;
+ display: inline;
+ color: white;
+}
+
+#filters #filter-relationships #filter-node-header:active,
+#filters #filter-relationships #filter-rel-header:active,
+#filters #filter-nodes #filter-node-header:active,
+#filters #filter-nodes #filter-rel-header:active {
+ border: none;
+ box-shadow: none;
+}
+
+#filters #filter-relationships #rel-dropdown,
+#filters #filter-relationships #node-dropdown,
+#filters #filter-nodes #rel-dropdown,
+#filters #filter-nodes #node-dropdown {
+ margin: 20px 0;
+ border-radius: none;
+ border: none;
+ background: transparent;
+}
+
+#filters #filter-relationships #rel-dropdown li,
+#filters #filter-relationships #node-dropdown li,
+#filters #filter-nodes #rel-dropdown li,
+#filters #filter-nodes #node-dropdown li {
+ padding: 5px;
+}
+
+#filters #filter-relationships #rel-dropdown li:hover,
+#filters #filter-relationships #node-dropdown li:hover,
+#filters #filter-nodes #rel-dropdown li:hover,
+#filters #filter-nodes #node-dropdown li:hover {
+ background-color: rgba(255,255,255,0.2);
+}
+
+#filters .disabled {
+ color: rgba(255,255,255,0.5);
+}
+
+#filters .disabled:hover {
+ color: #68b9fe;
+}
+
+.alchemy {
+ position: relative;
+}
+
+.alchemy #search form {
+ z-index: 2;
+ display: inline;
+ margin-left: 100px;
+}
+
+.alchemy #add-tag {
+ width: 300px;
+ display: inline-block;
+}
+
+.alchemy #tags input {
+ max-width: 220px;
+}
+
+.alchemy #tags-list {
+ padding: 0;
+}
+
+.alchemy #tags-list .icon-remove-sign {
+ cursor: pointer;
+}
+
+.alchemy #tags-list li {
+ display: inline-block;
+ margin-top: 5px;
+}
+
+.alchemy #tags-list span {
+ background-color: #ccc;
+ color: #333;
+ border-radius: 10em;
+ display: inline-block;
+ padding: 1px 6px;
+}
+
+.alchemy #filter-nodes label,
+.alchemy #filter-relationships label {
+ font-weight: normal;
+ margin-right: 1em;
+}
+
+.alchemy .clear {
+ clear: both;
+}
+
+.alchemy text {
+ font-weight: 200;
+ text-anchor: middle;
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.css b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.css
new file mode 100644
index 0000000..6571ef0
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.css
@@ -0,0 +1,714 @@
+@-webkit-keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 25% {
+ opacity: .3;
+ }
+
+ 50% {
+ opacity: .66;
+ }
+
+ 75% {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 25% {
+ opacity: .3;
+ }
+
+ 50% {
+ opacity: .66;
+ }
+
+ 75% {
+ opacity: 1;
+ }
+}
+
+@-webkit-keyframes pulse {
+ 0% {
+ text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
+ }
+
+ 25% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
+ }
+
+ 50% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
+ }
+
+ 75% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
+ }
+}
+
+@keyframes pulse {
+ 0% {
+ text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
+ }
+
+ 25% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
+ }
+
+ 50% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
+ }
+
+ 75% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
+ }
+}
+
+@-webkit-keyframes slide-in {
+ 0% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+}
+
+@keyframes slide-in {
+ 0% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+}
+
+@-webkit-keyframes slide-out {
+ 0% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+}
+
+@keyframes slide-out {
+ 100% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+}
+
+svg {
+ position: absolute;
+ left: 0;
+ cursor: -webkit-grab;
+ height: 100%;
+ width: 100%;
+ color: #333;
+}
+
+.node {
+ cursor: pointer;
+}
+
+.node text.root {
+ font-size: 32px;
+}
+
+.node text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+}
+
+.node.active {
+ opacity: 1;
+}
+
+.node.active.selected text {
+ display: block;
+}
+
+.node.active:hover text {
+ display: block;
+}
+
+defs #arrow path {
+ stroke: #CCC;
+ stroke-opacity: 0.2;
+ fill: #CCC;
+ opacity: 1;
+}
+
+.edge text {
+ stroke-width: 0;
+}
+
+.edge .edge-handler {
+ fill: none;
+ stroke: none;
+}
+
+.edge .edge-line {
+ fill: none;
+}
+
+.edge.active text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+ z-index: 1000;
+}
+
+.edge.active:hover,
+.edge.active.selected {
+ cursor: pointer;
+}
+
+.edge.active:hover text,
+.edge.active.selected text {
+ display: block;
+}
+
+.edge.active.highlight text {
+ display: block;
+}
+
+#zoom-controls {
+ background-color: transparent;
+ background-image: url("images/maze-black.png");
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ box-shadow: 0 0 5px rgba(255,255,255,0.3);
+ margin-top: 10%;
+ z-index: 5;
+ position: relative;
+ display: block;
+ width: 55px;
+}
+
+#zoom-controls #zoom-in,
+#zoom-controls #zoom-out,
+#zoom-controls #zoom-reset {
+ padding: 12px;
+ margin: 0;
+ width: 100%;
+}
+
+#zoom-controls #zoom-in i,
+#zoom-controls #zoom-out i,
+#zoom-controls #zoom-reset i {
+ color: #E89619;
+}
+
+#zoom-controls #zoom-in:hover,
+#zoom-controls #zoom-out:hover,
+#zoom-controls #zoom-reset:hover {
+ background-color: rgba(255,255,255,0.2);
+}
+
+#zoom-controls #zoom-in:active,
+#zoom-controls #zoom-out:active,
+#zoom-controls #zoom-reset:active {
+ border: none;
+}
+
+.fa-caret-right,
+.fa-caret-down,
+.fa-search {
+ margin: 0 5px;
+ color: #e89619;
+}
+
+#search {
+ margin-top: 2em;
+ margin-bottom: 1em;
+ padding: .5em 1em;
+ width: 100%;
+}
+
+#search span {
+ vertical-align: bottom;
+}
+
+#search input {
+ background-color: black;
+ border: none;
+ font-size: 20px;
+ color: white;
+ padding-left: 0.5em;
+}
+
+#search .search-icon {
+ height: 22px;
+ background-color: #000;
+ border-color: #000;
+ border-right-color: #111;
+}
+
+#stats {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #e89619;
+}
+
+#stats #stats-header {
+ padding: 10px;
+}
+
+#stats #all-stats {
+ color: white;
+ border-radius: none;
+ border: none;
+ background: transparent;
+ overflow: auto;
+}
+
+#stats #all-stats li {
+ padding: 3px;
+}
+
+#stats #node-stats-graph,
+#stats #edge-stats-graph {
+ height: 250px;
+}
+
+#stats #node-stats-graph svg,
+#stats #edge-stats-graph svg {
+ opacity: .6;
+ background: transparent;
+}
+
+#stats #node-stats-graph text,
+#stats #edge-stats-graph text {
+ font-size: 16px;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+}
+
+#stats #node-stats-graph .no-data,
+#stats #edge-stats-graph .no-data {
+ margin: 30px 0;
+ color: #e89619;
+}
+
+#stats .badge {
+ border-radius: 0;
+ height: 100%;
+ background-color: rgba(104,185,254,0.6);
+}
+
+#editor {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #e89619;
+}
+
+#editor h3 {
+ padding: 10px;
+}
+
+#editor #element-options {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+ cursor: pointer;
+ margin-top: 10px;
+ margin-left: 2%;
+ color: white;
+}
+
+#editor #element-options .property,
+#editor #element-options #add-property-form {
+ display: -webkit-inline-flex;
+ display: inline-flex;
+ margin: 4px 0;
+ width: 100%;
+}
+
+#editor #element-options .property-value,
+#editor #element-options #add-property-form #add-property #add-prop-value {
+ border: thin rgba(255,255,255,0.2) solid;
+ border-left: none;
+ background-color: black;
+ color: white;
+ width: 100%;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+#editor #element-options .property-name,
+#editor #element-options #add-property-form #add-property #add-prop-key {
+ text-align: center;
+ font-weight: 200;
+ cursor: default;
+ background: #2E2E2E;
+ border: thin transparent solid;
+ color: #e89619;
+ border-right: none;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+#editor #element-options input[type="submit"],
+#editor #element-options #update-properties {
+ color: #e89619;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ width: auto;
+ background: rgba(255,255,255,0.1);
+ border: thin solid #e89619;
+ text-align: center;
+}
+
+#editor #element-options input[type="submit"]:active,
+#editor #element-options #update-properties:active,
+#editor #element-options input[type="submit"]:focus,
+#editor #element-options #update-properties:focus {
+ outline: none;
+}
+
+#editor #element-options input[type="submit"]:hover,
+#editor #element-options #update-properties:hover {
+ color: white;
+ border: thin solid white;
+}
+
+#editor #element-options #update-properties {
+ border-radius: 4px;
+ padding: 10px;
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+#editor #element-options #add-property-form #add-property {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-grow: 2;
+ flex-grow: 2;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+}
+
+#editor #element-options #add-property-form #add-property #add-prop-value {
+ text-align: center;
+ width: 100%;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 4px;
+ border: thin rgba(255,255,255,0.2) solid;
+}
+
+#editor #element-options #add-property-form #add-property #add-prop-key {
+ cursor: text;
+ width: 100%;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 0;
+}
+
+#editor #editor-interactions.active {
+ color: #e89619;
+}
+
+#editor #editor-interactions.inactive {
+ color: white;
+}
+
+#editor #node-editor.enabled,
+#editor #edge-editor.enabled {
+ -webkit-animation: fadeIn 1s linear;
+ animation: fadeIn 1s linear;
+}
+
+#control-dash-wrapper {
+ font-family: 'Source Sans Pro', Helvetica, sans-serif;
+ letter-spacing: .05em;
+ height: inherit;
+ z-index: inherit;
+ padding: 0;
+}
+
+#control-dash-wrapper.initial {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+}
+
+#control-dash-wrapper.initial #dash-toggle {
+ color: #e89619;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper.off-canvas {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ -webkit-animation: slide-out .75s linear;
+ animation: slide-out .75s linear;
+}
+
+#control-dash-wrapper.off-canvas #dash-toggle {
+ color: #e89619;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper.on-canvas {
+ -webkit-animation: slide-in .75s ease-in-out;
+ animation: slide-in .75s ease-in-out;
+}
+
+#control-dash-wrapper.on-canvas * {
+ box-shadow: none !important;
+}
+
+#control-dash-wrapper.on-canvas #dash-toggle {
+ color: rgba(232,150,25,0.6);
+}
+
+#control-dash-wrapper.on-canvas #dash-toggle:hover {
+ color: #e89619;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper #control-dash {
+ overflow-x: hidden;
+ overflow-y: scroll;
+ background-color: transparent;
+ background-image: url("images/maze-black.png");
+ padding: 0;
+ height: inherit;
+ z-index: 5;
+}
+
+#control-dash-wrapper #control-dash h3 {
+ display: inline;
+ margin: 0;
+}
+
+#control-dash-wrapper #dash-toggle {
+ z-index: 5;
+ background-color: transparent;
+ background-image: url("images/maze-black.png");
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ box-shadow: 0 0 5px rgba(255,255,255,0.3);
+ position: absolute;
+ left: 0;
+ top: 50%;
+ font-size: 2.2em;
+ color: rgba(255,255,255,0.2);
+ padding: 10px;
+}
+
+#control-dash-wrapper button {
+ border-radius: 0;
+ border: none;
+ background-color: transparent;
+}
+
+#control-dash-wrapper button:active {
+ border: none;
+}
+
+#control-dash-wrapper h3 {
+ font-weight: 200;
+ margin-top: 10px;
+ color: white;
+ cursor: pointer;
+ vertical-align: top;
+}
+
+#control-dash-wrapper li {
+ cursor: pointer;
+ background: transparent;
+ border: none;
+ border-radius: 0;
+}
+
+#clustering {
+ padding: 0.5em 1em;
+ cursor: pointer;
+ color: white;
+ border-bottom: thin dashed #E89619;
+}
+
+#clustering #cluster_control_header,
+#clustering #cluster-key-container {
+ padding: 10px 10px 0 10px;
+}
+
+#clustering #cluster-key {
+ color: #333;
+ background-color: #000;
+ border-radius: 4px;
+ border: thin solid #333;
+ text-align: center;
+ display: inline-block;
+ width: 100%;
+}
+
+#filters {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #e89619;
+ color: white;
+}
+
+#filters form {
+ width: 100%;
+}
+
+#filters #filter-header {
+ padding: 10px;
+}
+
+#filters #filter-relationships,
+#filters #filter-nodes {
+ background-color: transparent;
+ display: inline-block;
+ width: 45%;
+ margin-left: 2%;
+ overflow: auto;
+ text-align: center;
+ vertical-align: top;
+}
+
+#filters #filter-relationships #filter-node-header,
+#filters #filter-relationships #filter-rel-header,
+#filters #filter-nodes #filter-node-header,
+#filters #filter-nodes #filter-rel-header {
+ margin: 10px 0;
+ cursor: pointer;
+ background-color: transparent;
+ border: none;
+ border-radius: 0;
+ width: 100%;
+}
+
+#filters #filter-relationships #filter-node-header h4,
+#filters #filter-relationships #filter-rel-header h4,
+#filters #filter-nodes #filter-node-header h4,
+#filters #filter-nodes #filter-rel-header h4 {
+ font-weight: 200;
+ display: inline;
+ color: white;
+}
+
+#filters #filter-relationships #filter-node-header:active,
+#filters #filter-relationships #filter-rel-header:active,
+#filters #filter-nodes #filter-node-header:active,
+#filters #filter-nodes #filter-rel-header:active {
+ border: none;
+ box-shadow: none;
+}
+
+#filters #filter-relationships #rel-dropdown,
+#filters #filter-relationships #node-dropdown,
+#filters #filter-nodes #rel-dropdown,
+#filters #filter-nodes #node-dropdown {
+ margin: 20px 0;
+ border-radius: none;
+ border: none;
+ background: transparent;
+}
+
+#filters #filter-relationships #rel-dropdown li,
+#filters #filter-relationships #node-dropdown li,
+#filters #filter-nodes #rel-dropdown li,
+#filters #filter-nodes #node-dropdown li {
+ padding: 5px;
+}
+
+#filters #filter-relationships #rel-dropdown li:hover,
+#filters #filter-relationships #node-dropdown li:hover,
+#filters #filter-nodes #rel-dropdown li:hover,
+#filters #filter-nodes #node-dropdown li:hover {
+ background-color: rgba(255,255,255,0.2);
+}
+
+#filters .disabled {
+ color: rgba(255,255,255,0.5);
+}
+
+#filters .disabled:hover {
+ color: #fdc670;
+}
+
+.alchemy {
+ position: relative;
+}
+
+.alchemy #search form {
+ z-index: 2;
+ display: inline;
+ margin-left: 100px;
+}
+
+.alchemy #add-tag {
+ width: 300px;
+ display: inline-block;
+}
+
+.alchemy #tags input {
+ max-width: 220px;
+}
+
+.alchemy #tags-list {
+ padding: 0;
+}
+
+.alchemy #tags-list .icon-remove-sign {
+ cursor: pointer;
+}
+
+.alchemy #tags-list li {
+ display: inline-block;
+ margin-top: 5px;
+}
+
+.alchemy #tags-list span {
+ background-color: #ccc;
+ color: #333;
+ border-radius: 10em;
+ display: inline-block;
+ padding: 1px 6px;
+}
+
+.alchemy #filter-nodes label,
+.alchemy #filter-relationships label {
+ font-weight: normal;
+ margin-right: 1em;
+}
+
+.alchemy .clear {
+ clear: both;
+}
+
+.alchemy text {
+ font-weight: 200;
+ text-anchor: middle;
+}
\ No newline at end of file
[03/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
new file mode 100644
index 0000000..dc5b39a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
@@ -0,0 +1,565 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+public abstract class AbstractConditionalBlock extends AbstractElementProcessor {
+
+ private static Map<String, Test> tests = new HashMap<String, Test>();
+
+ static {
+ addNormal(new TestHasRole(), "has-role");
+ addNegated(new TestHasRole(), "has-not-role");
+
+ addNormal(new TestVariableExists(), "variable-exists");
+ addNegated(new TestVariableExists(), "variable-missing");
+ addNormal(new TestVariableTrue(), "variable-true");
+ addNegated(new TestVariableTrue(), "variable-false");
+
+ addNormal(new TestObjectPersistent(), "object-persistent");
+ addNegated(new TestObjectPersistent(), "object-transient");
+ addNormal(new TestObjectType(), "object-type");
+ /*
+ * addNormal(new TestObjectIs(), "object-is"); addNegated(new
+ * TestObjectIs(), "object-is-not"); addNormal(new TestObjectType(),
+ * "object-type"); addNormal(new TestObjectType(),
+ * "object-title-equals"); addNegated(new TestObjectType(),
+ * "object-title-not-equals"); addNormal(new TestObjectType(),
+ * "object-title-contains"); addNegated(new TestObjectType(),
+ * "object-title-not-contains");
+ */
+ addNormal(new TestCollectionFull(), "collection-full");
+ addNegated(new TestCollectionFull(), "collection-empty");
+ addNormal(new TestCollectionType(), "collection-type");
+ // addNormal(new TestCollectionSize(), "collection-size-equal");
+ // addNormal(new TestCollectionSize(), "collection-size-less-than");
+ // addNormal(new TestCollectionSize(), "collection-size-greater-than");
+
+ addNormal(new TestFieldValue(), "test-field");
+ addNegated(new TestFieldValue(), "test-field");
+
+ addNormal(new TestFieldExists(), "field-exists");
+ addNegated(new TestFieldExists(), "field-missing");
+ addNormal(new TestFieldVisible(), "field-visible");
+ addNegated(new TestFieldVisible(), "field-hidden");
+ addNormal(new TestFieldEditable(), "field-editable");
+ addNegated(new TestFieldEditable(), "field-not-editable");
+ addNormal(new TestFieldType(), "field-type");
+ addNormal(new TestFieldSet(), "field-set");
+ addNegated(new TestFieldSet(), "field-empty");
+ // empty/set etc
+
+ addNormal(new TestMethodExists(), "method-exists");
+ addNegated(new TestMethodExists(), "method-missing");
+ addNormal(new TestMethodVisible(), "method-visible");
+ addNegated(new TestMethodVisible(), "method-hidden");
+ addNormal(new TestMethodUseable(), "method-useable");
+ addNegated(new TestMethodUseable(), "method-not-useable");
+
+ }
+
+ private static void addNegated(final Test test, final String name) {
+ test.name = name;
+ test.negateResult = true;
+ tests.put(name, test);
+ }
+
+ private static void addNormal(final Test test, final String name) {
+ test.name = name;
+ tests.put(name, test);
+ }
+
+ @Override
+ public void process(final Request request) {
+ final String id = request.getOptionalProperty(OBJECT);
+
+ boolean checkMade = false;
+ boolean allConditionsMet = true;
+
+ final String[] propertyNames = request.getAttributes().getPropertyNames(new String[] { "object", "collection" });
+ for (final String propertyName : propertyNames) {
+ boolean result;
+ if (propertyName.equals("set")) {
+ result = request.isPropertySet("set");
+ } else {
+ final Test test = tests.get(propertyName);
+ if (test == null) {
+ throw new ScimpiException("No such test: " + propertyName);
+ }
+ final String attributeValue = request.getOptionalProperty(propertyName, false);
+ result = test.test(request, attributeValue, id);
+ if (test.negateResult) {
+ result = !result;
+ }
+ }
+ checkMade = true;
+ allConditionsMet &= result;
+ }
+
+ /*
+ *
+ * // Check variables if
+ * (request.isPropertySpecified("variable-exists")) { boolean
+ * valuePresent = request.isPropertySet("variable-exists"); checkMade =
+ * true; allConditionsMet &= valuePresent; }
+ *
+ * String variable = request.getOptionalProperty("variable-true"); if
+ * (variable != null) { String value = (String)
+ * request.getContext().getVariable(variable); checkMade = true;
+ * allConditionsMet &= Attributes.isTrue(value); }
+ *
+ * variable = request.getOptionalProperty("variable-equals"); if
+ * (variable != null) { String value = (String)
+ * request.getContext().getVariable(variable); checkMade = true;
+ * allConditionsMet &= variable.equals(value); }
+ */
+ // Check Object
+
+ /*
+ * // Check Collection String collection =
+ * request.getOptionalProperty("collection-" + TYPE); if (collection !=
+ * null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), collection); Class<?>
+ * cls = forClass(request); TypeOfFacet facet =
+ * object.getSpecification().getFacet(TypeOfFacet.class); boolean
+ * hasType = object != null && (cls == null ||
+ * cls.isAssignableFrom(facet.value())); checkMade = true;
+ * allConditionsMet &= hasType;; }
+ *
+ * collection = request.getOptionalProperty("collection-" + "empty"); if
+ * (collection != null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), id); CollectionFacet
+ * facet = object.getSpecification().getFacet(CollectionFacet.class);
+ * boolean isEmpty = facet != null && facet.size(object) == 0;
+ * processTags(isEmpty, request); allConditionsMet &= isEmpty; }
+ */
+
+ // Check Methods
+ /*
+ * String method = request.getOptionalProperty(METHOD + "-exists"); if
+ * (method != null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), id); List<? extends
+ * ObjectAction> objectActions =
+ * object.getSpecification().getObjectActions(ActionType.USER); boolean
+ * methodExists = false; for (ObjectAction objectAssociation :
+ * objectActions) { if (objectAssociation.getId().equals(method)) {
+ * methodExists = true; break; } } checkMade = true; allConditionsMet &=
+ * methodExists; }
+ *
+ * method = request.getOptionalProperty(METHOD + "-visible"); if (method
+ * != null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), id); // TODO needs to
+ * work irrespective of parameters ObjectAction objectAction =
+ * object.getSpecification().getObjectAction(ActionType.USER, method,
+ * ObjectSpecification.EMPTY_LIST); Consent visible =
+ * objectAction.isVisible(IsisContext.getAuthenticationSession(),
+ * object); checkMade = true; allConditionsMet &= visible.isAllowed(); }
+ *
+ * method = request.getOptionalProperty(METHOD + "-usable"); if (method
+ * != null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), id); // TODO needs to
+ * work irrespective of parameters ObjectAction objectAction =
+ * object.getSpecification().getObjectAction(ActionType.USER, method,
+ * ObjectSpecification.EMPTY_LIST); Consent usable =
+ * objectAction.isUsable(IsisContext.getAuthenticationSession(),
+ * object); checkMade = true; allConditionsMet &= usable.isAllowed(); }
+ *
+ *
+ * // Check Fields String field = request.getOptionalProperty(FIELD +
+ * "-exists"); if (field != null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), id); List<? extends
+ * ObjectAssociation> objectFields =
+ * object.getSpecification().getAssociations(); boolean fieldExists =
+ * false; for (ObjectAssociation objectAssociation : objectFields) { if
+ * (objectAssociation.getId().equals(field)) { fieldExists = true;
+ * break; } } checkMade = true; allConditionsMet &= fieldExists; }
+ *
+ * field = request.getOptionalProperty(FIELD + "-visible"); if (field !=
+ * null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), id); ObjectAssociation
+ * objectField = object.getSpecification().getAssociation(field);
+ * Consent visible =
+ * objectField.isVisible(IsisContext.getAuthenticationSession(),
+ * object); checkMade = true; allConditionsMet &= visible.isAllowed(); }
+ *
+ * field = request.getOptionalProperty(FIELD + "-editable"); if (field
+ * != null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), id); ObjectAssociation
+ * objectField = object.getSpecification().getAssociation(field);
+ * Consent usable =
+ * objectField.isUsable(IsisContext.getAuthenticationSession(), object);
+ * checkMade = true; allConditionsMet &= usable.isAllowed(); }
+ *
+ * field = request.getOptionalProperty(FIELD + "-empty"); if (field !=
+ * null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), id); ObjectAssociation
+ * objectField = object.getSpecification().getAssociation(field);
+ * IsisContext.getPersistenceSession().resolveField(object,
+ * objectField); ObjectAdapter fld = objectField.get(object); if (fld ==
+ * null) { checkMade = true; allConditionsMet &= true; } else {
+ * CollectionFacet facet =
+ * fld.getSpecification().getFacet(CollectionFacet.class); boolean
+ * isEmpty = facet != null && facet.size(fld) == 0; processTags(isEmpty,
+ * request); allConditionsMet &= isEmpty; } }
+ *
+ * field = request.getOptionalProperty(FIELD + "-set"); if (field !=
+ * null) { ObjectAdapter object =
+ * MethodsUtils.findObject(request.getContext(), id); ObjectAssociation
+ * objectField = object.getSpecification().getAssociation(field);
+ * IsisContext.getPersistenceSession().resolveField(object,
+ * objectField); ObjectAdapter fld = objectField.get(object); if (fld ==
+ * null) { throw new ScimpiException("No object for field-set " +
+ * field); } Object fieldValue = fld.getObject(); if (fieldValue
+ * instanceof Boolean) { checkMade = true; allConditionsMet &=
+ * ((Boolean) fieldValue).booleanValue(); } else { checkMade = true;
+ * allConditionsMet &= true; } }
+ */
+
+ // Check User
+ /*
+ * String hasRole = request.getOptionalProperty("has-role"); if (hasRole
+ * != null) { AuthenticationSession session =
+ * IsisContext.getSession().getAuthenticationSession(); List<String>
+ * roles = session.getRoles(); boolean hasMatchingRole = false; for
+ * (String role : roles) { if (role.equals(hasRole.trim())) {
+ * hasMatchingRole = true; break; } } checkMade = true; allConditionsMet
+ * &= hasMatchingRole; }
+ */
+
+ final String persistent = request.getOptionalProperty("persistent");
+ if (persistent != null) {
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(persistent);
+ checkMade = true;
+ allConditionsMet &= object.representsPersistent();
+ }
+ /*
+ * String type = request.getOptionalProperty(TYPE); if (type != null) {
+ * ObjectAdapter object = MethodsUtils.findObject(request.getContext(),
+ * id); Class<?> cls = forClass(request); boolean hasType = object !=
+ * null && (cls == null ||
+ * cls.isAssignableFrom(object.getObject().getClass())); checkMade =
+ * true; allConditionsMet &= hasType;; }
+ */
+ if (request.isPropertySpecified("empty")) {
+ if (request.isPropertySet("empty")) {
+ final String collection = request.getOptionalProperty("empty");
+ if (collection != null) {
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(collection);
+ final CollectionFacet facet = object.getSpecification().getFacet(CollectionFacet.class);
+ checkMade = true;
+ allConditionsMet &= facet.size(object) == 0;
+ }
+ } else {
+ checkMade = true;
+ allConditionsMet &= true;
+ }
+ }
+
+ if (request.isPropertySpecified("set")) {
+ final boolean valuePresent = request.isPropertySet("set");
+ checkMade = true;
+ allConditionsMet &= valuePresent;
+ }
+
+ if (checkMade) {
+ processTags(allConditionsMet, request);
+ } else {
+ throw new ScimpiException("No condition in " + getName());
+ }
+ }
+
+ protected abstract void processTags(boolean isSet, Request request);
+
+}
+
+abstract class Test {
+ String name;
+ boolean negateResult;
+
+ abstract boolean test(Request request, String attributeName, String targetId);
+
+ protected Class<?> forClass(final String className) {
+ Class<?> cls = null;
+ if (className != null) {
+ try {
+ cls = Class.forName(className);
+ } catch (final ClassNotFoundException e) {
+ throw new ScimpiException("No class for " + className, e);
+ }
+ }
+ return cls;
+ }
+
+ protected ObjectAction findMethod(final String attributeName, final ObjectAdapter object) {
+ final ObjectAction objectAction = object.getSpecification().getObjectAction(ActionType.USER, attributeName, ObjectSpecification.EMPTY_LIST);
+ if (objectAction == null) {
+ throw new ScimpiException("No such method found in " + object.getSpecification().getIdentifier().getClassName() + " : " + attributeName);
+ }
+ return objectAction;
+ }
+
+ protected ObjectAssociation findProperty(final String attributeName, final ObjectAdapter object) {
+ final ObjectAssociation objectField = object.getSpecification().getAssociation(attributeName);
+ if (objectField == null) {
+ throw new ScimpiException("No such property found in " + object.getSpecification().getIdentifier().getClassName() + ": " + attributeName);
+ }
+ return objectField;
+ }
+
+}
+
+class TestVariableExists extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ Object variable = request.getContext().getVariable(attributeName);
+ if (variable instanceof String && ((String) variable).equals("")) {
+ return false;
+ }
+ return variable != null;
+ }
+}
+
+class TestVariableTrue extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final Object variable = request.getContext().getVariable(attributeName);
+ final Boolean value = variable instanceof Boolean ? (Boolean) variable : Boolean.valueOf((String) variable);
+ return value != null && value.booleanValue();
+ }
+}
+
+class TestObjectPersistent extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(attributeName);
+ return object.representsPersistent();
+ }
+}
+
+class TestObjectType extends TestObjectPersistent {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ final Class<?> cls = forClass(attributeName);
+ final boolean hasType = object != null && (cls == null || cls.isAssignableFrom(object.getObject().getClass()));
+ return hasType;
+ }
+}
+
+class TestCollectionType extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ final Class<?> cls = forClass(attributeName);
+ final TypeOfFacet facet = object.getSpecification().getFacet(TypeOfFacet.class);
+ final boolean hasType = object != null && (cls == null || cls.isAssignableFrom(facet.value()));
+ return hasType;
+ }
+}
+
+class TestCollectionFull extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), attributeName);
+ final CollectionFacet facet = object.getSpecification().getFacet(CollectionFacet.class);
+ final boolean isEmpty = facet != null && facet.size(object) == 0;
+ return !isEmpty;
+ }
+}
+
+class TestMethodExists extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ final List<? extends ObjectAction> objectActions = object.getSpecification().getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
+ boolean methodExists = false;
+ for (final ObjectAction objectAssociation : objectActions) {
+ if (objectAssociation.getId().equals(attributeName)) {
+ methodExists = true;
+ break;
+ }
+ }
+ return methodExists;
+ }
+}
+
+class TestMethodVisible extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ // TODO needs to work irrespective of parameters
+ final ObjectAction objectAction = findMethod(attributeName, object);
+ final Consent visible = objectAction.isVisible(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE);
+ return visible.isAllowed();
+ }
+}
+
+class TestMethodUseable extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ // TODO needs to work irrespective of parameters
+ final ObjectAction objectAction = findMethod(attributeName, object);
+ final Consent usable = objectAction.isUsable(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE);
+ return usable.isAllowed();
+ }
+}
+
+class TestFieldExists extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ final List<? extends ObjectAssociation> objectFields = object.getSpecification().getAssociations(Contributed.EXCLUDED);
+ boolean fieldExists = false;
+ for (final ObjectAssociation objectAssociation : objectFields) {
+ if (objectAssociation.getId().equals(attributeName)) {
+ fieldExists = true;
+ break;
+ }
+ }
+ return fieldExists;
+ }
+}
+
+class TestFieldVisible extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ final ObjectAssociation objectField = findProperty(attributeName, object);
+ final Consent visible = objectField.isVisible(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE);
+ return visible.isAllowed();
+ }
+}
+
+class TestFieldEditable extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ final ObjectAssociation objectField = findProperty(attributeName, object);
+ final Consent usable = objectField.isUsable(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE);
+ return usable.isAllowed();
+ }
+}
+
+class TestFieldType extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ final Class<?> cls = forClass(attributeName);
+ final boolean hasType = object != null && (cls == null || cls.isAssignableFrom(object.getObject().getClass()));
+ return hasType;
+ }
+}
+
+class TestFieldSet extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ final ObjectAssociation objectField = findProperty(attributeName, object);
+
+ ResolveFieldUtil.resolveField(object, objectField);
+ final ObjectAdapter fld = objectField.get(object);
+ if (fld != null) {
+ final Object fieldValue = fld.getObject();
+ if (fieldValue instanceof Boolean) {
+ return ((Boolean) fieldValue).booleanValue();
+ } else if (fld.getSpecification().containsFacet(CollectionFacet.class)) {
+ final CollectionFacet facet = fld.getSpecification().getFacet(CollectionFacet.class);
+ final boolean isEmpty = facet != null && facet.size(fld) == 0;
+ return !isEmpty;
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+class TestFieldValue extends Test {
+ @Override
+ boolean test(Request request, String attributeName, String targetId) {
+ int pos = attributeName.indexOf("==");
+ // TODO test for other comparators
+ // TODO fail properly if none found
+ String fieldName = attributeName.substring(0, pos);
+ String fieldValue = attributeName.substring(pos + 2);
+
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
+ final ObjectAssociation objectField = findProperty(fieldName, object);
+ ResolveFieldUtil.resolveField(object, objectField);
+ final ObjectAdapter fld = objectField.get(object);
+
+ // TODO test for reference or value
+ final ObjectAdapter object2 = MethodsUtils.findObject(request.getContext(), fieldValue);
+
+ if (fld == object2) {
+ return true;
+ }
+ return false;
+ }
+
+}
+
+class TestHasRole extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final String[] requiredRoles = attributeName.split("\\|");
+ final AuthenticationSession session = IsisContext.getSession().getAuthenticationSession();
+ final List<String> sessionRoles = session.getRoles();
+ for (final String sessionRole : sessionRoles) {
+ for (final String requiredRole : requiredRoles) {
+ if (requiredRole.trim().equals(sessionRole)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
+
+class TestSet extends Test {
+ @Override
+ boolean test(final Request request, final String attributeName, final String targetId) {
+ final boolean valuePresent = request.isPropertySet("set");
+ return valuePresent;
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
new file mode 100644
index 0000000..b6798be
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+public abstract class AbstractLink extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String title = request.getOptionalProperty(FORM_TITLE);
+ final String name = request.getOptionalProperty(NAME);
+ final boolean showAsButton = request.isRequested("show-as-button", false);
+ final String linkClass = request.getOptionalProperty(CLASS, showAsButton ? "button" : defaultLinkClass());
+ final String containerClass = request.getOptionalProperty(CONTAINER_CLASS, "action");
+ final String object = request.getOptionalProperty(OBJECT);
+ final RequestContext context = request.getContext();
+ String objectId = object != null ? object : (String) context.getVariable(RequestContext.RESULT);
+ ObjectAdapter adapter = MethodsUtils.findObject(context, objectId);
+
+ // REVIEW this is common used code
+ final String fieldName = request.getOptionalProperty(FIELD);
+ if (fieldName != null) {
+ final ObjectAssociation field = adapter.getSpecification().getAssociation(fieldName);
+ if (field == null) {
+ throw new ScimpiException("No field " + fieldName + " in " + adapter.getSpecification().getFullIdentifier());
+ }
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ final Where where = Where.ANYWHERE;
+
+ if (field.isVisible(IsisContext.getAuthenticationSession(), adapter, where).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+ ResolveFieldUtil.resolveField(adapter, field);
+ adapter = field.get(adapter);
+ if (adapter != null) {
+ objectId = context.mapObject(adapter, Scope.INTERACTION);
+ }
+ }
+
+ if (adapter != null && valid(request, adapter)) {
+ final String variable = request.getOptionalProperty("param-name", RequestContext.RESULT);
+ final String variableSegment = variable + "=" + objectId;
+
+ String view = request.getOptionalProperty(VIEW);
+ if (view == null) {
+ view = defaultView();
+ }
+ view = context.fullUriPath(view);
+ final String classSegment = " class=\"" + linkClass + "\"";
+ final String titleSegment = title == null ? "" : (" title=\"" + title + "\"");
+ String additionalSegment = additionalParameters(request);
+ additionalSegment = additionalSegment == null ? "" : "&" + additionalSegment;
+ if (showAsButton) {
+ request.appendHtml("<div class=\"" + containerClass + "\">");
+ }
+ request.appendHtml("<a" + classSegment + titleSegment + " href=\"" + view + "?" + variableSegment + context.encodedInteractionParameters() + additionalSegment + "\">");
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String buffer = request.popBuffer();
+ if (buffer.trim().length() > 0) {
+ request.appendHtml(buffer);
+ } else {
+ request.appendAsHtmlEncoded(linkLabel(name, adapter));
+ }
+ request.appendHtml("</a>");
+ if (showAsButton) {
+ request.appendHtml("</div>");
+ }
+ } else {
+ request.skipUntilClose();
+ }
+ }
+
+ private String defaultLinkClass() {
+ return "action";
+ }
+
+ protected abstract String linkLabel(String name, ObjectAdapter object);
+
+ protected String additionalParameters(final Request request) {
+ return null;
+ }
+
+ protected abstract boolean valid(Request request, ObjectAdapter adapter);
+
+ protected abstract String defaultView();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockDefine.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockDefine.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockDefine.java
new file mode 100644
index 0000000..cea5d11
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockDefine.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
+
+public class BlockDefine extends AbstractElementProcessor {
+
+ @Override
+ public String getName() {
+ return "block";
+ }
+
+ @Override
+ public void process(final Request request) {
+ final String name = request.getOptionalProperty(NAME, "unamed");
+ final RepeatMarker start = request.createMarker();
+ request.skipUntilClose();
+ request.getContext().addVariable("_block-" + name, start, Scope.REQUEST);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockUse.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockUse.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockUse.java
new file mode 100644
index 0000000..efd6128
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockUse.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
+
+public class BlockUse extends AbstractElementProcessor {
+
+ @Override
+ public String getName() {
+ return "use-block";
+ }
+
+ @Override
+ public void process(final Request request) {
+ final String name = request.getOptionalProperty(NAME, "unamed");
+ request.closeEmpty();
+ final RepeatMarker end = request.createMarker();
+
+ final RepeatMarker marker = (RepeatMarker) request.getContext().getVariable("_block-" + name);
+ marker.repeat();
+
+ request.processUtilCloseTag();
+ end.repeat();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Commit.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Commit.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Commit.java
new file mode 100644
index 0000000..4106fd9
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Commit.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Commit extends AbstractElementProcessor {
+
+ @Override
+ public String getName() {
+ return "commit";
+ }
+
+ @Override
+ public void process(final Request request) {
+ // Note - the session will have changed since the earlier call if a user
+ // has logged in or out in the action
+ // processing above.
+ final IsisTransactionManager transactionManager = IsisContext.getPersistenceSession().getTransactionManager();
+ if (transactionManager.getTransaction().getState().canCommit()) {
+ transactionManager.endTransaction();
+ transactionManager.startTransaction();
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ContentTag.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ContentTag.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ContentTag.java
new file mode 100644
index 0000000..ddda339
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ContentTag.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class ContentTag implements ElementProcessor {
+
+ @Override
+ public String getName() {
+ return "content";
+ }
+
+ @Override
+ public void process(final Request request) {
+ request.appendHtml("<!-- apply content -->");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/CookieValue.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/CookieValue.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/CookieValue.java
new file mode 100644
index 0000000..09e56b0
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/CookieValue.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class CookieValue extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ String name = request.getRequiredProperty(NAME);
+ String resultName = request.getOptionalProperty(RESULT_NAME, name);
+ final String scopeName = request.getOptionalProperty(SCOPE);
+ final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
+
+ String cookieString = request.getContext().getCookie(name);
+
+ request.appendDebug(" " + resultName + " (" + scope + ") set to " + cookieString + " from cookie " + name);
+ request.getContext().addVariable(resultName, cookieString, scope);
+ }
+
+ @Override
+ public String getName() {
+ return "cookie-value";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/DefaultValue.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/DefaultValue.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/DefaultValue.java
new file mode 100644
index 0000000..2cd9593
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/DefaultValue.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class DefaultValue extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ // String sourceObjectId = objectOrResult(request);
+ final String variableName = request.getRequiredProperty(NAME);
+ final String defaultValue = request.getOptionalProperty(VALUE);
+ final String scopeName = request.getOptionalProperty(SCOPE);
+ final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
+
+ final RequestContext context = request.getContext();
+ final Object currentValue = context.getVariable(variableName);
+ if (currentValue == null) {
+ request.appendDebug(" " + variableName + " set to " + defaultValue + " (" + scope + ")");
+ context.addVariable(variableName, defaultValue, scope);
+ } else {
+ request.appendDebug(" " + variableName + " alreadt set to " + currentValue);
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "default";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
new file mode 100644
index 0000000..ab43eb6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class EditLink extends AbstractLink {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ protected boolean valid(final Request request, final ObjectAdapter adapter) {
+ final ObjectSpecification specification = adapter.getSpecification();
+ final AuthenticationSession session = IsisContext.getAuthenticationSession();
+ final List<ObjectAssociation> visibleFields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, adapter, where));
+ final ImmutableFacet facet = specification.getFacet(ImmutableFacet.class);
+ final boolean isImmutable = facet != null && facet.when() == When.ALWAYS;
+ final boolean isImmutableOncePersisted = facet != null && facet.when() == When.ONCE_PERSISTED && adapter.representsPersistent();
+ return visibleFields.size() > 0 && !isImmutable && !isImmutableOncePersisted;
+ }
+
+ @Override
+ protected String linkLabel(final String name, final ObjectAdapter object) {
+ return "edit";
+ }
+
+ @Override
+ protected String defaultView() {
+ return Dispatcher.GENERIC + Dispatcher.EDIT + "." + Dispatcher.EXTENSION;
+ }
+
+ @Override
+ public String getName() {
+ return "edit-link";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EndSession.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EndSession.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EndSession.java
new file mode 100644
index 0000000..1a37f99
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EndSession.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class EndSession extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ request.getContext().endHttpSession();
+ }
+
+ @Override
+ public String getName() {
+ return "end-session";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Forward.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Forward.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Forward.java
new file mode 100644
index 0000000..e63ec92
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Forward.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Forward extends AbstractElementProcessor {
+
+ @Override
+ public String getName() {
+ return "forward";
+ }
+
+ @Override
+ public void process(final Request request) {
+ final String view = request.getRequiredProperty(VIEW);
+ request.getContext().forward(view);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/GetCookie.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/GetCookie.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/GetCookie.java
new file mode 100644
index 0000000..f58b13f
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/GetCookie.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class GetCookie extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String name = request.getRequiredProperty("name");
+ final String cookie = request.getContext().getCookie(name);
+
+ request.appendHtml(cookie);
+ }
+
+ @Override
+ public String getName() {
+ return "get-cookie";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Import.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Import.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Import.java
new file mode 100644
index 0000000..1b66290
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Import.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Import extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ request.appendHtml("<!-- " + " import " + request.getOptionalProperty("file") + " -->");
+ }
+
+ @Override
+ public String getName() {
+ return "import";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromCookie.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromCookie.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromCookie.java
new file mode 100644
index 0000000..1e3f47e
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromCookie.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class InitializeFromCookie extends AbstractElementProcessor {
+ private static final String SEVEN_DAYS = Integer.toString(60 * 24 * 7);
+
+ @Override
+ public void process(final Request request) {
+ final String name = request.getRequiredProperty(NAME);
+
+ final RequestContext context = request.getContext();
+ if (context.getVariable(name) != null) {
+ request.skipUntilClose();
+ } else {
+ final String scopeName = request.getOptionalProperty(SCOPE);
+ final Scope scope = RequestContext.scope(scopeName, Scope.SESSION);
+
+ final String cookieName = request.getOptionalProperty("cookie", name);
+ final String cookieValue = context.getCookie(cookieName);
+ boolean hasObject;
+ if (cookieValue != null) {
+ try {
+ context.getMappedObject(cookieValue);
+ hasObject = true;
+ } catch (final ObjectNotFoundException e) {
+ hasObject = false;
+ }
+ } else {
+ hasObject = false;
+ }
+
+ if (hasObject) {
+ request.skipUntilClose();
+ context.addVariable(name, cookieValue, scope);
+ } else {
+ final String expiresString = request.getOptionalProperty("expires", SEVEN_DAYS);
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ request.popBuffer();
+ final String id = (String) context.getVariable(RequestContext.RESULT);
+ final ObjectAdapter variable = context.getMappedObject(id);
+ if (variable != null) {
+ context.addCookie(cookieName, id, Integer.valueOf(expiresString));
+ context.addVariable(name, id, scope);
+ }
+ }
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "initialize-from-cookie";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromResult.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromResult.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromResult.java
new file mode 100644
index 0000000..375fdd2
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromResult.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class InitializeFromResult extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ disallowSourceAndDefault(request);
+ final String sourceObjectId = objectOrResult(request);
+ final Class<?> cls = forClass(request);
+ final String variableName = request.getRequiredProperty(NAME);
+ final String defaultObjectId = request.getOptionalProperty(DEFAULT);
+ final String scopeName = request.getOptionalProperty(SCOPE);
+ final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
+
+ final RequestContext context = request.getContext();
+ final ObjectAdapter sourceObject = context.getMappedObject(sourceObjectId);
+ final boolean isSourceSet = sourceObject != null;
+ final boolean isSourceAssignable = isSourceSet && (cls == null || cls.isAssignableFrom(sourceObject.getObject().getClass()));
+ if (isSourceAssignable) {
+ request.appendDebug(" " + variableName + " set to " + sourceObjectId + " (" + scope + ")");
+ context.addVariable(variableName, sourceObjectId, scope);
+ } else {
+ request.appendDebug(" " + variableName + " set to " + sourceObjectId + " (" + scope + ")");
+ if (defaultObjectId != null) {
+ context.addVariable(variableName, defaultObjectId, scope);
+ }
+ context.changeScope(variableName, scope);
+ }
+ }
+
+ private String objectOrResult(final Request request) {
+ final String sourceObjectId = request.getOptionalProperty(OBJECT);
+ if (sourceObjectId == null) {
+ return (String) request.getContext().getVariable(RequestContext.RESULT);
+ } else {
+ return sourceObjectId;
+ }
+ }
+
+ private void disallowSourceAndDefault(final Request request) {
+ if (request.getOptionalProperty(DEFAULT) != null && request.getOptionalProperty(OBJECT) != null) {
+ throw new ScimpiException("Cannot specify both " + OBJECT + " and " + DEFAULT + " for the " + getName() + " element");
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "initialize";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Localization.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Localization.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Localization.java
new file mode 100644
index 0000000..fe1474b
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Localization.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+/**
+ * Displays the localization data for the current user.
+ */
+public class Localization extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ request.closeEmpty();
+
+ org.apache.isis.applib.profiles.Localization localization = IsisContext.getLocalization();
+ if (localization != null) {
+ Locale locale = localization.getLocale();
+ String country = locale.getDisplayName();
+ // country = locale.toString();
+ String timeZone = localization.getTimeZone().getDisplayName();
+
+ request.appendAsHtmlEncoded(country + ", " + timeZone);
+ } else {
+ request.appendAsHtmlEncoded("No localization data!");
+ }
+
+ Locale locale = Locale.getDefault();
+ String country = locale.getDisplayName();
+ // country = locale.toString();
+ String timeZone = TimeZone.getDefault().getDisplayName();
+
+ request.appendAsHtmlEncoded("\n (Default " + country + ", " + timeZone +")");
+
+ }
+
+ @Override
+ public String getName() {
+ return "alpha-localization";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Mark.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Mark.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Mark.java
new file mode 100644
index 0000000..febafb6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Mark.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Mark extends AbstractElementProcessor {
+
+ // TODO the return points should be pushed on to a stack so that there is
+ // traceable history.
+ @Override
+ public void process(final Request request) {
+ // String name = request.getOptionalProperty(NAME);
+ final RequestContext context = request.getContext();
+ context.addVariable("_return-to", context.getUri(), Scope.SESSION);
+ }
+
+ @Override
+ public String getName() {
+ return "mark";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/NewActionLink.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/NewActionLink.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/NewActionLink.java
new file mode 100644
index 0000000..5929f81
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/NewActionLink.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+public class NewActionLink extends AbstractLink {
+
+ // REVIEW: confirm this rendering context
+ private final Where where = Where.OBJECT_FORMS;
+
+ @Override
+ protected boolean valid(final Request request, final ObjectAdapter object) {
+ final String method = request.getRequiredProperty(METHOD);
+ final ObjectAction action = MethodsUtils.findAction(object, method);
+ return MethodsUtils.isVisibleAndUsable(object, action, where);
+ }
+
+ @Override
+ protected String linkLabel(final String name, final ObjectAdapter object) {
+ return "run";
+ }
+
+ @Override
+ protected String defaultView() {
+ return "_generic_action." + Dispatcher.EXTENSION;
+ }
+
+ @Override
+ protected String additionalParameters(final Request request) {
+ final String method = request.getRequiredProperty(METHOD);
+ return "method=" + method;
+ }
+
+ @Override
+ public String getName() {
+ return "new-action-link";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
new file mode 100644
index 0000000..f2726bf
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class ObjectLink extends AbstractLink {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ protected boolean valid(final Request request, final ObjectAdapter object) {
+ final AuthenticationSession session = IsisContext.getAuthenticationSession();
+ final List<ObjectAssociation> visibleFields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, object, where));
+ return visibleFields.size() > 0;
+ }
+
+ @Override
+ protected String linkLabel(final String name, final ObjectAdapter object) {
+ if (name == null) {
+ return object.titleString();
+ } else {
+ return name;
+ }
+ }
+
+ @Override
+ protected String defaultView() {
+ return Dispatcher.GENERIC + "." + Dispatcher.EXTENSION;
+ }
+
+ @Override
+ public String getName() {
+ return "object-link";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/PageTitle.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/PageTitle.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/PageTitle.java
new file mode 100644
index 0000000..10c3b13
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/PageTitle.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class PageTitle extends Variable {
+ @Override
+ public void process(final Request request) {
+ process(request, "title", null, null, false, Scope.REQUEST);
+ }
+
+ @Override
+ public String getName() {
+ return "page-title";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Redirect.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Redirect.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Redirect.java
new file mode 100644
index 0000000..6f3b0d8
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Redirect.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Redirect extends AbstractElementProcessor {
+
+ @Override
+ public String getName() {
+ return "redirect";
+ }
+
+ @Override
+ public void process(final Request request) {
+ final String view = request.getRequiredProperty(VIEW);
+ request.getContext().redirectTo(view);
+ }
+
+}
[18/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/SwfTag.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/SwfTag.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/SwfTag.java
deleted file mode 100644
index 6b097bb..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/SwfTag.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view;
-
-import org.apache.isis.viewer.scimpi.dispatcher.action.Attributes;
-
-public class SwfTag implements Snippet {
-
- public static final int END = 0;
- public static final int EMPTY = 1;
- public static final int START = 2;
- private final String tagName;
- private final int type;
- private final Attributes attributes;
- private final String lineNumbers;
- private final String path;
-
- public SwfTag(final String tagName, final Attributes attributes, final int type, final String lineNumbers, final String path) {
- this.tagName = tagName;
- this.attributes = attributes;
- this.type = type;
- this.lineNumbers = lineNumbers;
- this.path = path;
- }
-
- @Override
- public String getHtml() {
- return tagName;
- }
-
- public String getPath() {
- return path;
- }
-
- public int getType() {
- return type;
- }
-
- public String getName() {
- return tagName;
- }
-
- public Attributes getAttributes() {
- return attributes;
- }
-
- @Override
- public String errorAt() {
- return path + ":" + lineNumbers;
- }
-
- public String debug() {
- return path + ":" + lineNumbers + " - " + getAttributes();
- }
-
- @Override
- public String toString() {
- String t = null;
- switch (type) {
- case EMPTY:
- t = "empty";
- break;
- case START:
- t = "start";
- break;
- case END:
- t = "end";
- break;
- }
- return "SwfTag[name=" + tagName + ",path=" + path + ",line=" + lineNumbers + ",type=" + t + "]";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/VersionNumber.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/VersionNumber.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/VersionNumber.java
deleted file mode 100644
index 6b054b1..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/VersionNumber.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.view;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class VersionNumber extends AbstractElementProcessor {
-
- private static final String MARKER = "Implementation-Build: ";
- private static final String FILE = "/META-INF/MANIFEST.MF";
- private String version;
-
- @Override
- public String getName() {
- return "version-number";
- }
-
- @Override
- public void process(final Request request) {
- if (version == null) {
- version = "0000"; // default revision number
- loadRevisonNumber(request.getContext());
- }
- request.appendHtml(version);
- }
-
- private void loadRevisonNumber(final RequestContext context) {
- BufferedReader reader;
- try {
- String file = FILE;
-
- file = context.findFile(FILE);
- reader = new BufferedReader(new InputStreamReader(context.openStream(file)));
- String line;
- while ((line = reader.readLine()) != null) {
- if (line.startsWith(MARKER)) {
- version = line.substring(MARKER.length());
- break;
- }
- }
- reader.close();
- } catch (final IOException e) {
- throw new ScimpiException(e);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionButton.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionButton.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionButton.java
deleted file mode 100644
index 740de00..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionButton.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.action;
-
-import org.apache.commons.lang.StringEscapeUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
-
-public class ActionButton extends AbstractElementProcessor {
- private static final Logger LOG = LoggerFactory.getLogger(ActionButton.class);
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final static Where where = Where.ANYWHERE;
-
- @Override
- public void process(final Request request) {
- final String objectId = request.getOptionalProperty(OBJECT);
- final String methodName = request.getRequiredProperty(METHOD);
- final String forwardResultTo = request.getOptionalProperty(VIEW);
- final String forwardVoidTo = request.getOptionalProperty(VOID);
- final String forwardErrorTo = request.getOptionalProperty(ERROR);
- final String variable = request.getOptionalProperty(RESULT_NAME);
- final String scope = request.getOptionalProperty(SCOPE);
- final String buttonTitle = request.getOptionalProperty(BUTTON_TITLE);
- String resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
- final String idName = request.getOptionalProperty(ID, methodName);
- final String className = request.getOptionalProperty(CLASS);
- final boolean showMessage = request.isRequested(SHOW_MESSAGE, false);
- final String completionMessage = request.getOptionalProperty(MESSAGE);
-
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
- final String version = request.getContext().mapVersion(object);
- final ObjectAction action = MethodsUtils.findAction(object, methodName);
-
- final ActionContent parameterBlock = new ActionContent(action);
- request.setBlockContent(parameterBlock);
- request.processUtilCloseTag();
- final String[] parameters = parameterBlock.getParameters();
- final ObjectAdapter[] objectParameters;
-
- final ObjectAdapter target;
- if (false /*action.isContributed()*/) {
-// objectParameters= null;
-// System.arraycopy(parameters, 0, parameters, 1, parameters.length - 1);
-// parameters[0] = request.getContext().mapObject(object, Scope.REQUEST);
-// target = action.realTarget(object);
-// if (!action.hasReturn() && resultOverride == null) {
-// resultOverride = parameters[0];
-// }
- } else {
- objectParameters = new ObjectAdapter[parameters.length];
- target = object;
- int i = 0;
- for (final ObjectActionParameter spec : action.getParameters()) {
- final ObjectSpecification type = spec.getSpecification();
- if (parameters[i] == null) {
- objectParameters[i] = null;
- } else if (type.getFacet(ParseableFacet.class) != null) {
- final ParseableFacet facet = type.getFacet(ParseableFacet.class);
- Localization localization = IsisContext.getLocalization();
- objectParameters[i] = facet.parseTextEntry(null, parameters[i], localization);
- } else {
- objectParameters[i] = MethodsUtils.findObject(request.getContext(), parameters[i]);
- }
- i++;
- }
- }
-
- if (MethodsUtils.isVisibleAndUsable(object, action, where) && MethodsUtils.canRunMethod(object, action, objectParameters).isAllowed()) {
- // TODO use the form creation mechanism as used in ActionForm
- write(request, target, action, parameters, version, forwardResultTo, forwardVoidTo, forwardErrorTo, variable, scope, buttonTitle, completionMessage, resultOverride, idName, className);
- }
-
- if (showMessage) {
- final Consent usable = action.isUsable(IsisContext.getAuthenticationSession(), object, where);
- if (usable.isVetoed()) {
- final String notUsable = usable.getReason();
- if (notUsable != null) {
- String title = buttonTitle == null ? action.getName() : buttonTitle;
- disabledButton(request, title, notUsable, idName, className);
- }
- } else {
- final Consent valid = action.isProposedArgumentSetValid(object, objectParameters);
- final String notValid = valid.getReason();
- if (notValid != null) {
- String title = buttonTitle == null ? action.getName() : buttonTitle;
- disabledButton(request, title, notValid, idName, className);
- }
- }
- }
-
- request.popBlockContent();
- }
-
- private void disabledButton(final Request request, final String buttonTitle, String message, String id, String className) {
- if (className == null) {
- className = "access";
- }
- request.appendHtml("<div id=\"" + id + "\" class=\"" + className + " disabled-form\">");
- request.appendHtml("<div class=\"button disabled\" title=\"");
- request.appendAsHtmlEncoded(message);
- request.appendHtml("\" >" + buttonTitle);
- request.appendHtml("</div>");
- request.appendHtml("</div>");
- }
-
- public static void write(
- final Request request,
- final ObjectAdapter object,
- final ObjectAction action,
- final String[] parameters,
- final String version,
- String forwardResultTo,
- String forwardVoidTo,
- String forwardErrorTo,
- final String variable,
- final String scope,
- String buttonTitle,
- final String completionMessage,
- final String resultOverride,
- final String idName,
- final String className) {
- final RequestContext context = request.getContext();
-
- buttonTitle = buttonTitle != null ? buttonTitle : action.getName();
-
- if (action.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
- LOG.info("action not visible " + action.getName());
- return;
- }
- final Consent usable = action.isUsable(IsisContext.getAuthenticationSession(), object, where);
- if (usable.isVetoed()) {
- LOG.info("action not available: " + usable.getReason());
- return;
- }
-
- /*
- *
- * TODO this mechanism fails as it tries to process tags - which we dont
- * need! Also it calls action 'edit' (not 'action'). Field[] fields =
- * new Field[0]; HiddenField[] hiddenFields = new HiddenField[] { new
- * HiddenField("service", serviceId), new HiddenField("method",
- * methodName), new HiddenField("view", forwardToView), variable == null
- * ? null : new HiddenField("variable", variable), };
- * Form.createForm(request, buttonTitle, fields, hiddenFields, false);
- */
-
- final String objectId = context.mapObject(object, Scope.INTERACTION);
- final String idSegment = idName == null ? "" : ("id=\"" + idName + "\" ");
- final String classSegment = "class=\"" + (className == null ? "action in-line" : className) + "\"";
- request.appendHtml("\n<form " + idSegment + classSegment + " action=\"action.app\" method=\"post\">\n");
- if (objectId == null) {
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + OBJECT + "\" value=\"" + context.getVariable(RequestContext.RESULT) + "\" />\n");
- } else {
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + OBJECT + "\" value=\"" + StringEscapeUtils.escapeHtml(objectId) + "\" />\n");
- }
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + VERSION + "\" value=\"" + version + "\" />\n");
- if (scope != null) {
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + SCOPE + "\" value=\"" + scope + "\" />\n");
- }
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + METHOD + "\" value=\"" + action.getId() + "\" />\n");
- if (forwardResultTo != null) {
- forwardResultTo = context.fullFilePath(forwardResultTo);
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + VIEW + "\" value=\"" + forwardResultTo + "\" />\n");
- }
- if (forwardErrorTo == null) {
- forwardErrorTo = request.getContext().getResourceFile();
- }
- forwardErrorTo = context.fullFilePath(forwardErrorTo);
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + ERROR + "\" value=\"" + forwardErrorTo + "\" />\n");
- if (forwardVoidTo == null) {
- forwardVoidTo = request.getContext().getResourceFile();
- }
- forwardVoidTo = context.fullFilePath(forwardVoidTo);
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + VOID + "\" value=\"" + forwardVoidTo + "\" />\n");
- if (variable != null) {
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + RESULT_NAME + "\" value=\"" + variable + "\" />\n");
- }
- if (resultOverride != null) {
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + RESULT_OVERRIDE + "\" value=\"" + resultOverride + "\" />\n");
- }
- if (completionMessage != null) {
- request.appendHtml(" <input type=\"hidden\" name=\"" + "_" + MESSAGE + "\" value=\"" + completionMessage + "\" />\n");
- }
-
- for (int i = 0; i < parameters.length; i++) {
- request.appendHtml(" <input type=\"hidden\" name=\"param" + (i + 1) + "\" value=\"" + parameters[i] + "\" />\n");
- }
- request.appendHtml(request.getContext().interactionFields());
- request.appendHtml(" <input class=\"button\" type=\"submit\" value=\"" + buttonTitle + "\" name=\"execute\" title=\"" + action.getDescription() + "\" />");
- HelpLink.append(request, action.getDescription(), action.getHelp());
- request.appendHtml("\n</form>\n");
- }
-
- @Override
- public String getName() {
- return "action-button";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionContent.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionContent.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionContent.java
deleted file mode 100644
index 2466726..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionContent.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.action;
-
-import java.util.List;
-
-import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class ActionContent implements BlockContent {
- private final ObjectAction action;
- private final String[] parameters;
- private int next;
-
- public ActionContent(final ObjectAction action) {
- this.action = action;
- this.parameters = new String[action.getParameterCount()];
- }
-
- public void setParameter(final String field, final String value) {
- int index;
- if (field == null) {
- index = next++;
- } else {
- index = Integer.valueOf(field).intValue() - 1;
- }
- if (index < 0 || index >= parameters.length) {
- throw new ScimpiException("Parameter numbers should be between 1 and " + parameters.length + ": " + index);
- }
- parameters[index] = value;
- }
-
- public ObjectAdapter[] getParameters(final Request request) {
- final ObjectAdapter[] params = new ObjectAdapter[parameters.length];
- final List<ObjectActionParameter> pars = action.getParameters();
- for (int i = 0; i < parameters.length; i++) {
- final ObjectSpecification typ = pars.get(i).getSpecification();
- if (typ.getFacet(ParseableFacet.class) != null) {
- final ParseableFacet facet = typ.getFacet(ParseableFacet.class);
- Localization localization = IsisContext.getLocalization();
- params[i] = facet.parseTextEntry(null, parameters[i], localization);
- } else {
- params[i] = request.getContext().getMappedObject(parameters[i]);
- }
- }
- return params;
- }
-
- public String[] getParameters() {
- return parameters;
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionForm.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionForm.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionForm.java
deleted file mode 100644
index 469b99d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionForm.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.action;
-
-import java.util.List;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.action.ActionAction;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-import org.apache.isis.viewer.scimpi.dispatcher.view.edit.FieldFactory;
-import org.apache.isis.viewer.scimpi.dispatcher.view.edit.FormFieldBlock;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.HiddenInputField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.HtmlFormBuilder;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
-
-public class ActionForm extends AbstractElementProcessor {
-
- // REVIEW: confirm this rendering context
- private final static Where where = Where.OBJECT_FORMS;
-
- @Override
- public void process(final Request request) {
- final CreateFormParameter parameters = new CreateFormParameter();
- parameters.objectId = request.getOptionalProperty(OBJECT);
- parameters.methodName = request.getRequiredProperty(METHOD);
- parameters.forwardResultTo = request.getOptionalProperty(VIEW);
- parameters.forwardVoidTo = request.getOptionalProperty(VOID);
- parameters.forwardErrorTo = request.getOptionalProperty(ERROR);
- parameters.cancelTo = request.getOptionalProperty(CANCEL_TO);
- parameters.showIcon = request.isRequested(SHOW_ICON, showIconByDefault());
- parameters.buttonTitle = request.getOptionalProperty(BUTTON_TITLE);
- parameters.formTitle = request.getOptionalProperty(FORM_TITLE);
- parameters.labelDelimiter = request.getOptionalProperty(LABEL_DELIMITER, ":");
- parameters.formId = request.getOptionalProperty(FORM_ID, request.nextFormId());
- parameters.resultName = request.getOptionalProperty(RESULT_NAME);
- parameters.resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
- parameters.scope = request.getOptionalProperty(SCOPE);
- parameters.className = request.getOptionalProperty(CLASS, "action full");
- parameters.showMessage = request.isRequested(SHOW_MESSAGE, false);
- parameters.completionMessage = request.getOptionalProperty(MESSAGE);
- parameters.id = request.getOptionalProperty(ID, parameters.methodName);
- createForm(request, parameters);
- }
-
- public static void createForm(final Request request, final CreateFormParameter parameterObject) {
- createForm(request, parameterObject, false);
- }
-
- protected static void createForm(final Request request, final CreateFormParameter parameterObject, final boolean withoutProcessing) {
- final RequestContext context = request.getContext();
- final ObjectAdapter object = MethodsUtils.findObject(context, parameterObject.objectId);
- final String version = request.getContext().mapVersion(object);
- final ObjectAction action = MethodsUtils.findAction(object, parameterObject.methodName);
- // TODO how do we distinguish between overloaded methods?
-
- // REVIEW Is this useful?
- if (action.getParameterCount() == 0) {
- throw new ScimpiException("Action form can only be used for actions with parameters");
- }
- if (parameterObject.showMessage && MethodsUtils.isVisible(object, action, where)) {
- final String notUsable = MethodsUtils.isUsable(object, action, where);
- if (notUsable != null) {
- if (!withoutProcessing) {
- request.skipUntilClose();
- }
- request.appendHtml("<div class=\"" + parameterObject.className + "-message\" >");
- request.appendAsHtmlEncoded(notUsable);
- request.appendHtml("</div>");
- return;
- }
- }
- if (!MethodsUtils.isVisibleAndUsable(object, action, where)) {
- if (!withoutProcessing) {
- request.skipUntilClose();
- }
- return;
- }
- final String objectId = context.mapObject(object, Scope.INTERACTION);
- final String errorView = context.fullFilePath(parameterObject.forwardErrorTo == null ? context.getResourceFile() : parameterObject.forwardErrorTo);
- final String voidView = context.fullFilePath(parameterObject.forwardVoidTo == null ? context.getResourceFile() : parameterObject.forwardVoidTo);
- if (false /* action.isContributed() && !action.hasReturn() && parameterObject.resultOverride == null */) {
- parameterObject.resultOverride = objectId;
- }
- final HiddenInputField[] hiddenFields = new HiddenInputField[] { new HiddenInputField("_" + OBJECT, objectId), new HiddenInputField("_" + VERSION, version), new HiddenInputField("_" + FORM_ID, parameterObject.formId), new HiddenInputField("_" + METHOD, parameterObject.methodName),
- parameterObject.forwardResultTo == null ? null : new HiddenInputField("_" + VIEW, context.fullFilePath(parameterObject.forwardResultTo)), new HiddenInputField("_" + VOID, voidView), new HiddenInputField("_" + ERROR, errorView),
- parameterObject.completionMessage == null ? null : new HiddenInputField("_" + MESSAGE, parameterObject.completionMessage), parameterObject.scope == null ? null : new HiddenInputField("_" + SCOPE, parameterObject.scope),
- parameterObject.resultOverride == null ? null : new HiddenInputField("_" + RESULT_OVERRIDE, parameterObject.resultOverride), parameterObject.resultName == null ? null : new HiddenInputField("_" + RESULT_NAME, parameterObject.resultName),
- parameterObject.resultName == null ? null : new HiddenInputField(RequestContext.RESULT, (String) request.getContext().getVariable(RequestContext.RESULT)) };
-
- // TODO when the block contains a selector tag it doesn't disable it if
- // the field cannot be edited!!!
- final FormFieldBlock containedBlock = new FormFieldBlock() {
- @Override
- public boolean isNullable(final String name) {
- final int index = Integer.parseInt(name.substring(5)) - 1;
- final ObjectActionParameter param = action.getParameters().get(index);
- return param.isOptional();
- }
- };
- request.setBlockContent(containedBlock);
- if (!withoutProcessing) {
- request.processUtilCloseTag();
- }
-
- final FormState entryState = (FormState) context.getVariable(ENTRY_FIELDS);
-
- // TODO the list of included fields should be considered in the next
- // method (see EditObject)
- final InputField[] formFields = createFields(action, object);
- containedBlock.hideExcludedParameters(formFields);
- containedBlock.setUpValues(formFields);
- initializeFields(context, object, action, formFields);
- setDefaults(context, object, action, formFields, entryState, parameterObject.showIcon);
- String errors = null;
- if (entryState != null && entryState.isForForm(parameterObject.formId)) {
- copyEntryState(context, object, action, formFields, entryState);
- errors = entryState.getError();
- }
- overrideWithHtml(context, containedBlock, formFields);
-
- String formTitle;
- if (parameterObject.formTitle == null) {
- formTitle = action.getName();
- } else {
- formTitle = parameterObject.formTitle;
- }
-
- String buttonTitle = parameterObject.buttonTitle;
- if (buttonTitle == null) {
- buttonTitle = action.getName();
- } else if (buttonTitle.equals("")) {
- buttonTitle = "Ok";
- }
-
- HtmlFormBuilder.createForm(request, ActionAction.ACTION + ".app", hiddenFields, formFields, parameterObject.className,
- parameterObject.id, formTitle, parameterObject.labelDelimiter, action.getDescription(), action.getHelp(), buttonTitle, errors, parameterObject.cancelTo);
-
- request.popBlockContent();
- }
-
- private static InputField[] createFields(final ObjectAction action, final ObjectAdapter object) {
- final int parameterCount = action.getParameterCount();
- final InputField[] fields = new InputField[parameterCount];
- for (int i = 0; i < fields.length; i++) {
- fields[i] = new InputField(ActionAction.parameterName(i));
- }
- return fields;
- }
-
- private static void initializeFields(final RequestContext context, final ObjectAdapter object, final ObjectAction action, final InputField[] fields) {
- final List<ObjectActionParameter> parameters = action.getParameters();
- for (int i = 0; i < fields.length; i++) {
- final InputField field = fields[i];
- final ObjectActionParameter param = parameters.get(i);
- if (false /*action.isContributed() && i == 0*/) {
- // fields[i].setValue(context.mapObject(object,
- // Scope.INTERACTION));
- fields[i].setType(InputField.REFERENCE);
- fields[i].setHidden(true);
- } else {
-
- fields[i].setHelpReference("xxxhelp");
- final ObjectAdapter[] optionsForParameter = action.getChoices(object)[i];
- FieldFactory.initializeField(context, object, param, optionsForParameter, !param.isOptional(), field);
- }
- }
- }
-
- /**
- * Sets up the fields with their initial values
- *
- * @param showIcon
- */
- private static void setDefaults(final RequestContext context, final ObjectAdapter object, final ObjectAction action, final InputField[] fields, final FormState entryState, final boolean showIcon) {
- final ObjectAdapter[] defaultValues = action.getDefaults(object);
- if (defaultValues == null) {
- return;
- }
-
- for (int i = 0; i < fields.length; i++) {
- final InputField field = fields[i];
- final ObjectAdapter defaultValue = defaultValues[i];
-
- final String title = defaultValue == null ? "" : defaultValue.titleString();
- if (field.getType() == InputField.REFERENCE) {
- final ObjectSpecification objectSpecification = action.getParameters().get(i).getSpecification();
- if (defaultValue != null) {
- final String imageSegment = showIcon ? "<img class=\"small-icon\" src=\"" + context.imagePath(objectSpecification) + "\" alt=\"" + objectSpecification.getShortIdentifier() + "\"/>" : "";
- final String html = imageSegment + title;
- final String value = context.mapObject(defaultValue, Scope.INTERACTION);
- field.setValue(value);
- field.setHtml(html);
- }
- } else {
- field.setValue(title);
- }
- }
- }
-
- private static void copyEntryState(final RequestContext context, final ObjectAdapter object, final ObjectAction action, final InputField[] fields, final FormState entryState) {
-
- for (final InputField field : fields) {
- final FieldEditState fieldState = entryState.getField(field.getName());
- if (fieldState != null) {
- if (field.isEditable()) {
- String entry;
- entry = fieldState.getEntry();
- field.setValue(entry);
- }
-
- field.setErrorText(fieldState.getError());
- }
- }
- }
-
- private static void overrideWithHtml(final RequestContext context, final FormFieldBlock containedBlock, final InputField[] formFields) {
- for (int i = 0; i < formFields.length; i++) {
- final String id = ActionAction.parameterName(i);
- if (containedBlock.hasContent(id)) {
- final String content = containedBlock.getContent(id);
- if (content != null) {
- formFields[i].setHtml(content);
- formFields[i].setType(InputField.HTML);
- }
- }
- }
- }
-
- @Override
- public String getName() {
- return "action-form";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionLink.java
deleted file mode 100644
index 520e2bc..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/ActionLink.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.action;
-
-import java.net.URLEncoder;
-
-import org.apache.commons.lang.StringEscapeUtils;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
-
-public class ActionLink extends AbstractElementProcessor {
-
- // REVIEW: confirm this rendering context
- private final Where where = Where.OBJECT_FORMS;
-
- @Override
- public void process(final Request request) {
- String objectId = request.getOptionalProperty(OBJECT);
- final String method = request.getOptionalProperty(METHOD);
- final String forwardResultTo = request.getOptionalProperty(VIEW);
- final String forwardVoidTo = request.getOptionalProperty(VOID);
- String resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
-
- final String resultName = request.getOptionalProperty(RESULT_NAME);
- final String resultNameSegment = resultName == null ? "" : "&" + RESULT_NAME + "=" + resultName;
- final String scope = request.getOptionalProperty(SCOPE);
- final String scopeSegment = scope == null ? "" : "&" + SCOPE + "=" + scope;
- final String confirm = request.getOptionalProperty(CONFIRM);
- final String completionMessage = request.getOptionalProperty(MESSAGE);
- final String idName = request.getOptionalProperty(ID, method);
- final String className = request.getOptionalProperty(CLASS);
-
-
- // TODO need a mechanism for globally dealing with encoding; then use
- // the new encode method
- final String confirmSegment = confirm == null ? "" : "&" + "_" + CONFIRM + "=" + URLEncoder.encode(confirm);
- final String messageSegment = completionMessage == null ? "" : "&" + "_" + MESSAGE + "=" + URLEncoder.encode(completionMessage);
-
- final RequestContext context = request.getContext();
- final ObjectAdapter object = MethodsUtils.findObject(context, objectId);
- final String version = context.mapVersion(object);
- final ObjectAction action = MethodsUtils.findAction(object, method);
-
- final ActionContent parameterBlock = new ActionContent(action);
- request.setBlockContent(parameterBlock);
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String text = request.popBuffer();
-
- final String[] parameters = parameterBlock.getParameters();
- final String target;
- /*
- if (action.isContributed()) {
- System.arraycopy(parameters, 0, parameters, 1, parameters.length - 1);
- parameters[0] = request.getContext().mapObject(object, Scope.REQUEST);
- target = request.getContext().mapObject(action.realTarget(object), Scope.REQUEST);
- if (!action.hasReturn() && resultOverride == null) {
- resultOverride = parameters[0];
- }
- } else {
- target = StringEscapeUtils.escapeHtml(request.getContext().mapObject(object, Scope.INTERACTION));
- }
- */
-
- final ObjectAdapter[] objectParameters;
-
- // TODO copied from ActionButton
- //final ObjectAdapter target;
- if (false /*action.isContributed() */) {
-// objectParameters= null;
-// System.arraycopy(parameters, 0, parameters, 1, parameters.length - 1);
-// parameters[0] = request.getContext().mapObject(object, Scope.REQUEST);
-// target = request.getContext().mapObject(action.realTarget(object), Scope.REQUEST);
-// if (!action.hasReturn() && resultOverride == null) {
-// resultOverride = parameters[0];
-// }
- } else {
- objectParameters = new ObjectAdapter[parameters.length];
- // target = object;
- target = StringEscapeUtils.escapeHtml(request.getContext().mapObject(object, Scope.INTERACTION));
- int i = 0;
- for (final ObjectActionParameter spec : action.getParameters()) {
- final ObjectSpecification type = spec.getSpecification();
- if (parameters[i] == null) {
- objectParameters[i] = null;
- } else if (type.getFacet(ParseableFacet.class) != null) {
- final ParseableFacet facet = type.getFacet(ParseableFacet.class);
- Localization localization = IsisContext.getLocalization();
- objectParameters[i] = facet.parseTextEntry(null, parameters[i], localization);
- } else {
- objectParameters[i] = MethodsUtils.findObject(request.getContext(), parameters[i]);
- }
- i++;
- }
- }
-
- if (MethodsUtils.isVisibleAndUsable(object, action, where) && MethodsUtils.canRunMethod(object, action, objectParameters).isAllowed()) {
- writeLink(request, idName, className, target, version, method, forwardResultTo, forwardVoidTo, resultNameSegment, resultOverride, scopeSegment,
- confirmSegment, messageSegment, context, action, parameters, text);
- }
- request.popBlockContent();
- }
-
- public static void writeLink(
- final Request request,
- final String idName,
- final String className,
- final String objectId,
- final String version,
- final String method,
- final String forwardResultTo,
- final String forwardVoidTo,
- final String resultNameSegment,
- final String resultOverride,
- final String scopeSegment,
- final String confirmSegment,
- final String messageSegment,
- final RequestContext context,
- final ObjectAction action,
- final String[] parameters,
- String text) {
- text = text == null || text.trim().equals("") ? action.getName() : text;
-
- String parameterSegment = "";
- for (int i = 0; i < parameters.length; i++) {
- parameterSegment += "¶m" + (i + 1) + "=" + parameters[i];
- }
-
- final String idSegment = idName == null ? "" : ("id=\"" + idName + "\" ");
- final String classSegment = "class=\"" + (className == null ? "action in-line" : className) + "\"";
- final String interactionParamters = context.encodedInteractionParameters();
- final String forwardResultSegment = forwardResultTo == null ? "" : "&" + "_" + VIEW + "=" + context.fullFilePath(forwardResultTo);
- final String resultOverrideSegment = resultOverride == null ? "" : "&" + "_" + RESULT_OVERRIDE + "=" + resultOverride;
- final String voidView = context.fullFilePath(forwardVoidTo == null ? context.getResourceFile() : forwardVoidTo);
- final String forwardVoidSegment = "&" + "_" + VOID + "=" + voidView;
- request.appendHtml("<a " + idSegment + classSegment + " href=\"action.app?" + "_" + OBJECT + "=" + objectId + "&" + "_" + VERSION + "=" + version
- + "&" + "_" + METHOD + "=" + method + resultOverrideSegment + forwardResultSegment + forwardVoidSegment + resultNameSegment
- + parameterSegment + scopeSegment + confirmSegment + messageSegment + interactionParamters + "\">");
- request.appendHtml(text);
- request.appendHtml("</a>");
- HelpLink.append(request, action.getDescription(), action.getHelp());
- }
-
- @Override
- public String getName() {
- return "action-link";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/CreateFormParameter.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/CreateFormParameter.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/CreateFormParameter.java
deleted file mode 100644
index 2628449..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/CreateFormParameter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.action;
-
-public class CreateFormParameter {
- public String methodName;
- public String forwardResultTo;
- public String forwardVoidTo;
- public String forwardErrorTo;
- public String buttonTitle;
- public String formTitle;
- public String formId;
- public String resultName;
- public String scope;
- public String objectId;
- public String description;
- public String helpReference;
- public String className;
- public String id;
- public String resultOverride;
- public boolean showMessage;
- public boolean showIcon;
- public String completionMessage;
- public String cancelTo;
- public String labelDelimiter;
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
deleted file mode 100644
index 21cff4e..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.action;
-
-import java.util.List;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.InclusionList;
-
-public class Methods extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final static Where where = Where.ANYWHERE;
-
- @Override
- public void process(final Request request) {
- String objectId = request.getOptionalProperty(OBJECT);
- final String view = request.getOptionalProperty(VIEW, "_generic_action." + Dispatcher.EXTENSION);
- final String cancelTo = request.getOptionalProperty(CANCEL_TO);
- final boolean showForms = request.isRequested(FORMS, false);
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
- if (objectId == null) {
- objectId = request.getContext().mapObject(object, null);
- }
-
- final InclusionList inclusionList = new InclusionList();
- request.setBlockContent(inclusionList);
- request.processUtilCloseTag();
-
- request.appendHtml("<div class=\"actions\">");
- if (inclusionList.includes("edit") && !object.getSpecification().isService()) {
- request.appendHtml("<div class=\"action\">");
- request.appendHtml("<a class=\"button\" href=\"_generic_edit." + Dispatcher.EXTENSION + "?_result=" + objectId + "\">Edit...</a>");
- request.appendHtml("</div>");
- }
- writeMethods(request, objectId, object, showForms, inclusionList, view, "_generic.shtml?_result=" + objectId);
- request.popBlockContent();
- request.appendHtml("</div>");
- }
-
- public static void writeMethods(
- final Request request,
- final String objectId,
- final ObjectAdapter adapter,
- final boolean showForms,
- final InclusionList inclusionList,
- final String view,
- final String cancelTo) {
- List<ObjectAction> actions = adapter.getSpecification().getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
- writeMethods(request, adapter, actions, objectId, showForms, inclusionList, view, cancelTo);
- // TODO determine if system is set up to display exploration methods
- if (true) {
- actions = adapter.getSpecification().getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED, Filters.<ObjectAction>any());
- writeMethods(request, adapter, actions, objectId, showForms, inclusionList, view, cancelTo);
- }
- // TODO determine if system is set up to display debug methods
- if (true) {
- actions = adapter.getSpecification().getObjectActions(ActionType.DEBUG, Contributed.INCLUDED, Filters.<ObjectAction>any());
- writeMethods(request, adapter, actions, objectId, showForms, inclusionList, view, cancelTo);
- }
- }
-
- private static void writeMethods(
- final Request request,
- final ObjectAdapter adapter,
- List<ObjectAction> actions,
- final String objectId,
- final boolean showForms,
- final InclusionList inclusionList,
- final String view,
- final String cancelTo) {
- actions = inclusionList.includedActions(actions);
- for (int j = 0; j < actions.size(); j++) {
- final ObjectAction action = actions.get(j);
- if (false /* action instanceof ObjectActionSet */) {
-// request.appendHtml("<div class=\"actions\">");
-// writeMethods(request, adapter, action.getActions(), objectId, showForms, inclusionList, view, cancelTo);
-// request.appendHtml("</div>");
- } else if (false /*action.isContributed()*/) {
-// if (action.getParameterCount() == 1 && adapter.getSpecification().isOfType(action.getParameters().get(0).getSpecification())) {
-// if (objectId != null) {
-// final ObjectAdapter target = request.getContext().getMappedObject(objectId);
-// final ObjectAdapter realTarget = action.realTarget(target);
-// final String realTargetId = request.getContext().mapObject(realTarget, Scope.INTERACTION);
-// writeMethod(request, adapter, new String[] { objectId }, action, realTargetId, showForms, view, cancelTo);
-// } else {
-// request.appendHtml("<div class=\"action\">");
-// request.appendAsHtmlEncoded(action.getName());
-// request.appendHtml("???</div>");
-// }
-// } else if (!adapter.getSpecification().isService()) {
-// writeMethod(request, adapter, new String[0], action, objectId, showForms, view, cancelTo);
-// }
- } else {
- writeMethod(request, adapter, new String[0], action, objectId, showForms, view, cancelTo);
- }
- }
- }
-
- private static void writeMethod(
- final Request request,
- final ObjectAdapter adapter,
- final String[] parameters,
- final ObjectAction action,
- final String objectId,
- final boolean showForms,
- final String view,
- final String cancelTo) {
- // if (action.isVisible(IsisContext.getSession(), null) &&
- // action.isVisible(IsisContext.getSession(), adapter))
- // {
- if (action.isVisible(IsisContext.getAuthenticationSession(), adapter, where).isAllowed()) {
- request.appendHtml("<div class=\"action\">");
- if (IsisContext.getSession() == null) {
- request.appendHtml("<span class=\"disabled\" title=\"no user logged in\">");
- request.appendAsHtmlEncoded(action.getName());
- request.appendHtml("</span>");
- /*
- * } else if (action.isUsable(IsisContext.getSession(),
- * null).isVetoed()) {
- * request.appendHtml("<span class=\"disabled\" title=\"" +
- * action.isUsable(IsisContext.getSession(), null).getReason() +
- * "\">"); request.appendHtml(action.getName());
- * request.appendHtml("</span>");
- */} else if (action.isUsable(IsisContext.getAuthenticationSession(), adapter, where).isVetoed()) {
- request.appendHtml("<span class=\"disabled\" title=\"" + action.isUsable(IsisContext.getAuthenticationSession(), adapter, where).getReason() + "\">");
- request.appendAsHtmlEncoded(action.getName());
- request.appendHtml("</span>");
- } else {
- final String version = request.getContext().mapVersion(adapter);
- if (action.getParameterCount() == 0 || (false /*action.isContributed() && action.getParameterCount() == 1*/ )) {
- ActionButton.write(request, adapter, action, parameters, version, "_generic." + Dispatcher.EXTENSION, null, null, null, null, null, null, null, null, null);
- } else if (showForms) {
- final CreateFormParameter params = new CreateFormParameter();
- params.objectId = objectId;
- params.methodName = action.getId();
- params.forwardResultTo = "_generic." + Dispatcher.EXTENSION;
- params.buttonTitle = "OK";
- params.formTitle = action.getName();
- ActionForm.createForm(request, params, true);
- } else {
- request.appendHtml("<a class=\"button\" href=\"" + view + "?_result=" + objectId + "&_" + VERSION + "=" + version + "&_" + METHOD + "=" + action.getId());
- if (cancelTo != null) {
- request.appendHtml("&_cancel-to=");
- request.appendAsHtmlEncoded("cancel-to=\"" + cancelTo + "\"");
- }
- request.appendHtml("\" title=\"" + action.getDescription() + "\">");
- request.appendAsHtmlEncoded(action.getName() + "...");
- request.appendHtml("</a>");
- }
- }
- request.appendHtml("</div>");
- }
- }
-
- @Override
- public String getName() {
- return "methods";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Parameter.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Parameter.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Parameter.java
deleted file mode 100644
index 69be5c5..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Parameter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.action;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
-import org.apache.isis.viewer.scimpi.dispatcher.TagOrderException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Parameter extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final BlockContent blockContent = request.getBlockContent();
- if (!(blockContent instanceof ActionContent)) {
- throw new TagOrderException(request);
- }
-
- final String field = request.getOptionalProperty(PARAMETER_NUMBER);
- final String value = request.getRequiredProperty(VALUE);
- final ActionContent block = (ActionContent) blockContent;
- block.setParameter(field, value);
- }
-
- @Override
- public String getName() {
- return "parameter";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/RunAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/RunAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/RunAction.java
deleted file mode 100644
index 9610457..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/RunAction.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.action;
-
-import java.util.List;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-public class RunAction extends AbstractElementProcessor {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- public void process(final Request request) {
- final RequestContext context = request.getContext();
-
- final String objectId = request.getOptionalProperty(OBJECT);
- final ObjectAdapter object = MethodsUtils.findObject(context, objectId);
-
- final String methodName = request.getRequiredProperty(METHOD);
- final ObjectAction action = MethodsUtils.findAction(object, methodName);
-
- final String variableName = request.getOptionalProperty(RESULT_NAME);
- final String scopeName = request.getOptionalProperty(SCOPE);
-
- final ActionContent parameterBlock = new ActionContent(action);
- request.setBlockContent(parameterBlock);
- request.processUtilCloseTag();
- final ObjectAdapter[] parameters = parameterBlock.getParameters(request);
-
- if (!MethodsUtils.isVisibleAndUsable(object, action, where)) {
- throw new ForbiddenException(action, ForbiddenException.VISIBLE_AND_USABLE);
- }
-
- // swap null parameter of the object's type to run a contributed method
- if (false /*action.isContributed()*/) {
- final List<ObjectActionParameter> parameterSpecs = action.getParameters();
- for (int i = 0; i < parameters.length; i++) {
- if (parameters[i] == null && object.getSpecification().isOfType(parameterSpecs.get(i).getSpecification())) {
- parameters[i] = object;
- break;
- }
- }
- }
-
- final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
- MethodsUtils.runMethod(context, action, object, parameters, variableName, scope);
- request.popBlockContent();
- }
-
- @Override
- public String getName() {
- return "run-action";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Services.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Services.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Services.java
deleted file mode 100644
index 2a621f1..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Services.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.action;
-
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.InclusionList;
-
-public class Services extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final boolean showForms = request.isRequested(FORMS, false);
- final String view = request.getOptionalProperty(VIEW, "_generic_action." + Dispatcher.EXTENSION);
- final String cancelTo = request.getOptionalProperty(CANCEL_TO);
-
- final InclusionList inclusionList = new InclusionList();
- request.setBlockContent(inclusionList);
- request.processUtilCloseTag();
-
- final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
- for (final ObjectAdapter adapter : serviceAdapters) {
- final String serviceId = request.getContext().mapObject(adapter, Scope.REQUEST);
- request.appendHtml("<div class=\"actions\">");
- request.appendHtml("<h3>");
- request.appendAsHtmlEncoded(adapter.titleString());
- request.appendHtml("</h3>");
- Methods.writeMethods(request, serviceId, adapter, showForms, inclusionList, view, cancelTo);
- request.appendHtml("</div>");
- }
- request.popBlockContent();
- }
-
- @Override
- public String getName() {
- return "services";
- }
-
- private static PersistenceSession getPersistenceSession() {
- return IsisContext.getPersistenceSession();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
deleted file mode 100644
index 1002c9f..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.collection;
-
-import java.util.Iterator;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
-
-public class Collection extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final RequestContext context = request.getContext();
-
- ObjectAdapter collection;
-
- final String field = request.getOptionalProperty(FIELD);
- if (field != null) {
- final String id = request.getOptionalProperty(OBJECT);
- final ObjectAdapter object = context.getMappedObjectOrResult(id);
- final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
- if (!objectField.isOneToManyAssociation()) {
- throw new ScimpiException("Field " + objectField.getId() + " is not a collection");
- }
- ResolveFieldUtil.resolveField(object, objectField);
- collection = objectField.get(object);
- } else {
- final String id = request.getOptionalProperty(COLLECTION);
- collection = context.getMappedObjectOrResult(id);
- }
-
- final RepeatMarker marker = request.createMarker();
-
- final String variable = request.getOptionalProperty(ELEMENT_NAME);
- final String scopeName = request.getOptionalProperty(SCOPE);
- final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
- final String rowClassesList = request.getOptionalProperty(ROW_CLASSES, ODD_ROW_CLASS + "|" + EVEN_ROW_CLASS);
- String[] rowClasses = new String[0];
- if (rowClassesList != null) {
- rowClasses = rowClassesList.split("[,|/]");
- }
-
- final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
- if (facet.size(collection) == 0) {
- request.skipUntilClose();
- } else {
- final Iterator<ObjectAdapter> iterator = facet.iterator(collection);
- int row = 0;
- while (iterator.hasNext()) {
- final ObjectAdapter element = iterator.next();
- context.addVariable("row", "" + (row + 1), Scope.REQUEST);
- if (rowClassesList != null) {
- context.addVariable("row-class", rowClasses[row % rowClasses.length], Scope.REQUEST);
- }
- context.addVariable(variable, context.mapObject(element, scope), scope);
- marker.repeat();
- request.processUtilCloseTag();
- row++;
- }
- }
- }
-
- @Override
- public String getName() {
- return COLLECTION;
- }
-
-}
[54/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/cy2neo.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/cy2neo.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/cy2neo.js
deleted file mode 100644
index 4a23be8..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/cy2neo.js
+++ /dev/null
@@ -1,4 +0,0 @@
-function Cy2Neo(config, graphId, sourceId, execId, urlSource) {
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/data.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/data.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/data.js
deleted file mode 100644
index 87d682c..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/data.js
+++ /dev/null
@@ -1,766 +0,0 @@
-var graph = {
- "nodes": [
- {
- "caption": "Screen Actors Guild Award for Outstanding Performance by a Female Actor in a Miniseries or Television Movie",
- "type": "award",
- "id": 595472
- },
- {
- "caption": "Children of the Corn III: Urban Harvest",
- "type": "movie",
- "id": 626470
- },
- {
- "caption": "Sleepwalking",
- "type": "movie",
- "id": 795744
- },
- {
- "caption": "That Thing You Do!",
- "type": "movie",
- "id": 692946
- },
- {
- "caption": "Trapped",
- "type": "movie",
- "id": 689794
- },
- {
- "caption": "Head in the Clouds",
- "type": "movie",
- "id": 709577
- },
- {
- "caption": "Waking Up in Reno",
- "type": "movie",
- "id": 635905
- },
- {
- "caption": "Battle in Seattle",
- "type": "movie",
- "id": 734583
- },
- {
- "caption": "Mighty Joe Young",
- "type": "movie",
- "id": 662595
- },
- {
- "caption": "Academy Award for Actress in a Leading Role",
- "type": "award",
- "id": 593781
- },
- {
- "caption": "The Devil's Advocate",
- "type": "movie",
- "id": 740763
- },
- {
- "caption": "Screen Actors Guild Award for Outstanding Performance by a Cast in a Motion Picture",
- "type": "award",
- "id": 595440
- },
- {
- "caption": "Silver Bear for Best Actress",
- "type": "award",
- "id": 601507
- },
- {
- "caption": "The Curse of the Jade Scorpion",
- "type": "movie",
- "id": 649461
- },
- {
- "caption": "MTV Movie Award for Best Female Performance",
- "type": "award",
- "id": 595074
- },
- {
- "caption": "15 Minutes",
- "type": "movie",
- "id": 634248
- },
- {
- "caption": "The Burning Plain",
- "type": "movie",
- "id": 670704
- },
- {
- "caption": "The Life and Death of Peter Sellers",
- "type": "movie",
- "id": 794982
- },
- {
- "caption": "Prometheus",
- "type": "movie",
- "id": 608746
- },
- {
- "caption": "Teen Choice Award for Choice Summer Movie Star: Female",
- "type": "award",
- "id": 599909
- },
- {
- "caption": "Chicago Film Critics Association Award for Best Actress",
- "type": "award",
- "id": 623686
- },
- {
- "caption": "Golden Globe Award for Best Supporting Actress - Series, Miniseries or Television Film",
- "type": "award",
- "id": 598027
- },
- {
- "caption": "Golden Globe Award for Best Actress - Musical or Comedy Film",
- "type": "award",
- "id": 595206
- },
- {
- "caption": "Mad Max: Fury Road",
- "type": "movie",
- "id": 804341
- },
- {
- "caption": "In the Valley of Elah",
- "type": "movie",
- "id": 621675
- },
- {
- "caption": "Screen Actors Guild Award for Outstanding Performance by a Female Actor in a Leading Role",
- "type": "award",
- "id": 593954
- },
- {
- "caption": "Golden Raspberry Award for Worst Actress",
- "type": "award",
- "id": 594134
- },
- {
- "caption": "East of Havana",
- "type": "movie",
- "id": 609415
- },
- {
- "caption": "The Road",
- "type": "movie",
- "id": 627715
- },
- {
- "caption": "Golden Globe Award for Best Actress - Drama Film",
- "type": "award",
- "id": 593776
- },
- {
- "caption": "Charles Jacobus Theron",
- "type": "person",
- "id": 314008
- },
- {
- "caption": "Jackson Theron",
- "type": "person",
- "id": 314009
- },
- {
- "caption": "Primetime Emmy Award for Outstanding Supporting Actress in a Miniseries or a Movie",
- "type": "award",
- "id": 595684
- },
- {
- "caption": "The Cider House Rules",
- "type": "movie",
- "id": 801237
- },
- {
- "caption": "The Astronaut's Wife",
- "type": "movie",
- "id": 657006
- },
- {
- "caption": "Broadcast Film Critics Association Award for Best Actress",
- "type": "award",
- "id": 601849
- },
- {
- "caption": "Hancock",
- "type": "movie",
- "id": 652245
- },
- {
- "caption": "Charlize Theron",
- "root": true,
- "id": 314003
- },
- {
- "caption": "Stuart Townsend",
- "type": "person",
- "id": 314004
- },
- {
- "caption": "Stephan Jenkins",
- "type": "person",
- "id": 314005
- },
- {
- "caption": "Benoni, Gauteng",
- "type": "person",
- "id": 314006
- },
- {
- "caption": "Gerda Jacoba Aletta Maritz",
- "type": "person",
- "id": 314007
- },
- {
- "caption": "Æon Flux",
- "type": "movie",
- "id": 663286
- },
- {
- "caption": "Snow White and the Huntsman",
- "type": "movie",
- "id": 599907
- },
- {
- "caption": "Young Adult",
- "type": "movie",
- "id": 661733
- },
- {
- "caption": "Reindeer Games",
- "type": "movie",
- "id": 761000
- },
- {
- "caption": "Monster",
- "type": "movie",
- "id": 729778
- },
- {
- "caption": "The Legend of Bagger Vance",
- "type": "movie",
- "id": 804616
- },
- {
- "caption": "Teen Choice Award for Choice Hissy Fit: Film",
- "type": "award",
- "id": 599908
- },
- {
- "caption": "The Yards",
- "type": "movie",
- "id": 781638
- },
- {
- "caption": "MTV Movie Award for Best Kiss",
- "type": "award",
- "id": 595095
- },
- {
- "caption": "Celebrity",
- "type": "movie",
- "id": 611629
- },
- {
- "caption": "Astro Boy",
- "type": "movie",
- "id": 818608
- },
- {
- "caption": "North Country",
- "type": "movie",
- "id": 784437
- },
- {
- "caption": "2 Days in the Valley",
- "type": "movie",
- "id": 615556
- },
- {
- "caption": "Satellite Award for Best Actress – Motion Picture",
- "type": "award",
- "id": 595704
- },
- {
- "caption": "Trial and Error",
- "type": "movie",
- "id": 799574
- },
- {
- "caption": "National Society of Film Critics Award for Best Actress",
- "type": "award",
- "id": 595702
- },
- {
- "caption": "Independent Spirit Award for Best Female Lead",
- "type": "award",
- "id": 595703
- },
- {
- "caption": "Two Eyes Staring",
- "type": "movie",
- "id": 788889
- },
- {
- "caption": "Sweet November",
- "type": "movie",
- "id": 811358
- },
- {
- "caption": "Teen Choice Movie Award: Villain",
- "type": "award",
- "id": 595082
- },
- {
- "caption": "Satellite Award for Best Supporting Actress – Drama",
- "type": "award",
- "id": 602151
- },
- {
- "caption": "San Francisco Film Critics Circle Award for Best Actress",
- "type": "award",
- "id": 669827
- },
- {
- "caption": "Independent Spirit Award for Best First Feature",
- "type": "award",
- "id": 599387
- },
- {
- "caption": "The Italian Job",
- "type": "movie",
- "id": 817380
- },
- {
- "caption": "Hollywood Confidential",
- "type": "movie",
- "id": 711550
- },
- {
- "caption": "Men of Honor",
- "type": "movie",
- "id": 682763
- },
- {
- "caption": "BAFTA Award for Best Actress in a Leading Role",
- "type": "award",
- "id": 594478
- }
- ],
- "edges": [
- {
- "source": 314003,
- "target": 621675,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 818608,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 601849,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 649461,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 669827,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 608746,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 593954,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 595702,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 601849,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 595095,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 729778,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 595703,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 811358,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 595472,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 661733,
- "caption": "PRODUCED"
- },
- {
- "source": 314003,
- "target": 784437,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 634248,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 662595,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 804616,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 595703,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 626470,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 599387,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 599908,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 682763,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 595702,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 788889,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 657006,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 795744,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 593781,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 594478,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 594134,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 595074,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 692946,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 740763,
- "caption": "ACTED_IN"
- },
- {
- "source": 314005,
- "target": 314003,
- "caption": "PARTNER_OF"
- },
- {
- "source": 314003,
- "target": 711550,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 595440,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 801237,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 599907,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 761000,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 781638,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 670704,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 609415,
- "caption": "PRODUCED"
- },
- {
- "source": 314003,
- "target": 314009,
- "caption": "PARENT_OF"
- },
- {
- "source": 314003,
- "target": 652245,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 661733,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 602151,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 635905,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 799574,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 593781,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 817380,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 611629,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 729778,
- "caption": "PRODUCED"
- },
- {
- "source": 314003,
- "target": 709577,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 804341,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 627715,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 794982,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 623686,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 595082,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 689794,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 788889,
- "caption": "PRODUCED"
- },
- {
- "source": 314007,
- "target": 314003,
- "caption": "PARENT_OF"
- },
- {
- "source": 314003,
- "target": 593776,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 734583,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 598027,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 601507,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 599909,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 314004,
- "caption": "PARTNER_OF"
- },
- {
- "source": 314003,
- "target": 663286,
- "caption": "ACTED_IN"
- },
- {
- "source": 314003,
- "target": 314006,
- "caption": "BORN_AT"
- },
- {
- "source": 314003,
- "target": 615556,
- "caption": "ACTED_IN"
- },
- {
- "source": 314004,
- "target": 314003,
- "caption": "PARTNER_OF"
- },
- {
- "source": 314008,
- "target": 314003,
- "caption": "PARENT_OF"
- },
- {
- "source": 314003,
- "target": 314005,
- "caption": "PARTNER_OF"
- },
- {
- "source": 314003,
- "target": 795744,
- "caption": "PRODUCED"
- },
- {
- "source": 314003,
- "target": 595704,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 670704,
- "caption": "EXEC_PRODUCED"
- },
- {
- "source": 314003,
- "target": 593954,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 595206,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 593776,
- "caption": "RECEIVED"
- },
- {
- "source": 314003,
- "target": 595704,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 595684,
- "caption": "NOMINATED"
- },
- {
- "source": 314003,
- "target": 599387,
- "caption": "NOMINATED"
- }
- ]
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/neo.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/neo.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/neo.js
deleted file mode 100644
index 651190a..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/neo.js
+++ /dev/null
@@ -1,73 +0,0 @@
-function Neo(urlSource) {
- function txUrl() {
- var url = (urlSource() || "http://localhost:7474").replace(/\/db\/data.*/,"");
- return url + "/db/data/cypher";
- }
- function getIdFromUrl(url){
- var segments = url.split('/');
- return segments[segments.length-1];
- }
- var me = {
- executeQuery: function(query, params, cb) {
- $.ajax(txUrl(), {
- type: "POST",
- data: JSON.stringify({
- query : query,
- params : params || {}
- }),
- contentType: "application/json",
- error: function(err) {
- cb(err);
- },
- success: function(res) {
- if (res.exception) {
- cb(res.exception);
- } else {
- var cols = res.columns;
- var rows = res.data.map(function(row) {
- var r = {};
- cols.forEach(function(col, index) {
- r[col] = row[index];
- });
- return r;
- });
- var nodes = [];
- var rels = [];
- var labels = [];
- res.data.forEach(function(row) {
-
- var node = row[0]['data'];
-
- for (var property in node) {
- if (Object.hasOwnProperty(property)) {
- var found = nodes.filter(function (m) { return m.id == node.id; }).length > 0;
- if (!found) {
- nodes.push(node);
- if (labels.indexOf(node.label) == -1) labels.push(node.label);
- }
- }
- }
-
- var rel = row[1];
- if(rel){
- rels = rels.concat({ source:getIdFromUrl(rel.start), target:getIdFromUrl(rel.end), caption:rel.type});
- }
- /*row.graph.nodes.forEach(function(n) {
- var found = nodes.filter(function (m) { return m.id == n.id; }).length > 0;
- if (!found) {
- var node = n.properties||{}; node.id=n.id;node.type=n.labels[0];
- nodes.push(node);
- if (labels.indexOf(node.type) == -1) labels.push(node.type);
- }
- });*/
-
- //rels = rels.concat(row.graph.relationships.map(function(r) { return { source:r.startNode, target:r.endNode, caption:r.type} }));
- });
- cb(null,{table:rows,graph:{nodes:nodes, edges:rels},labels:labels});
- }
- }
- });
- }
- };
- return me;
-}
[53/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/vendor.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/vendor.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/vendor.js
deleted file mode 100644
index b94281f..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/vendor.js
+++ /dev/null
@@ -1,10 +0,0 @@
-if(function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b=a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(hb.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=ob[a]={};return _.each(a.match(nb)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.
cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ub,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:tb.test(c)?_.parseJSON(c):c}catch(e){}sb.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Kb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)rb.set(a[c],"globalEval",!b||rb.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(rb.hasData(a)&&(f=rb.access(a),g=rb.set(b
,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sb.hasData(a)&&(h=sb.access(a),i=_.extend({},h),sb.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&yb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Ob[a];return c||(c=t(a,b),"none"!==c&&c||(Nb=(Nb||_("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=Nb[0].contentDocument,b.write(),b.close(),c=t(a,b),Nb.detach()),Ob[a]=c),c}function v(a,b,c){var d,e,f,g,h=a.style;return c=c||Rb(a),c&&(g=c.getProp
ertyValue(b)||c[b]),c&&(""!==g||_.contains(a.ownerDocument,a)||(g=_.style(a,b)),Qb.test(g)&&Pb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function w(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function x(a,b){if(b in a)return b;for(var c=b[0].toUpperCase()+b.slice(1),d=b,e=Xb.length;e--;)if(b=Xb[e]+c,b in a)return b;return d}function y(a,b,c){var d=Tb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=_.css(a,c+wb[f],!0,e)),d?("content"===c&&(g-=_.css(a,"padding"+wb[f],!0,e)),"margin"!==c&&(g-=_.css(a,"border"+wb[f]+"Width",!0,e))):(g+=_.css(a,"padding"+wb[f],!0,e),"padding"!==c&&(g+=_.css(a,"border"+wb[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Rb(a),g="border-box"
===_.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=v(a,b,f),(0>e||null==e)&&(e=a.style[b]),Qb.test(e))return e;d=g&&(Y.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=rb.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&xb(d)&&(f[g]=rb.access(d,"olddisplay",u(d.nodeName)))):(e=xb(d),"none"===c&&e||rb.set(d,"olddisplay",e?c:_.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function C(a,b,c,d,e){return new C.prototype.init(a,b,c,d,e)}function D(){return setTimeout(function(){Yb=void 0}),Yb=_.now()}function E(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=wb[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function F(a,b,c){for(var d,e=(cc[b]||[]).concat(cc["*"]),f=0,g=e.l
ength;g>f;f++)if(d=e[f].call(c,b,a))return d}function G(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},n=a.style,o=a.nodeType&&xb(a),p=rb.get(a,"fxshow");c.queue||(h=_._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,_.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[n.overflow,n.overflowX,n.overflowY],j=_.css(a,"display"),k="none"===j?rb.get(a,"olddisplay")||u(a.nodeName):j,"inline"===k&&"none"===_.css(a,"float")&&(n.display="inline-block")),c.overflow&&(n.overflow="hidden",l.always(function(){n.overflow=c.overflow[0],n.overflowX=c.overflow[1],n.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],$b.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(o?"hide":"show")){if("show"!==e||!p||void 0===p[d])continue;o=!0}m[d]=p&&p[d]||_.style(a,d)}else j=void 0;if(_.isEmptyObject(m))"inline"===("none"===j?u(a.nodeName):j)&&(n.displ
ay=j);else{p?"hidden"in p&&(o=p.hidden):p=rb.access(a,"fxshow",{}),f&&(p.hidden=!o),o?_(a).show():l.done(function(){_(a).hide()}),l.done(function(){var b;rb.remove(a,"fxshow");for(b in m)_.style(a,b,m[b])});for(d in m)g=F(o?p[d]:0,d,l),d in p||(p[d]=g.start,o&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function H(a,b){var c,d,e,f,g;for(c in a)if(d=_.camelCase(c),e=b[d],f=a[c],_.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=_.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function I(a,b,c){var d,e,f=0,g=bc.length,h=_.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Yb||D(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:_.extend({},b),opts:_.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c
,startTime:Yb||D(),duration:c.duration,tweens:[],createTween:function(b,c){var d=_.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(H(k,j.opts.specialEasing);g>f;f++)if(d=bc[f].call(j,a,k,j.opts))return d;return _.map(k,F,j),_.isFunction(j.opts.start)&&j.opts.start.call(a,j),_.fx.timer(_.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function J(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(nb)||[];if(_.isFunction(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function K(a,b,c,d){function e(h){var i;return f[h]=!0,_.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeo
f j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===vc;return e(b.dataTypes[0])||!f["*"]&&e("*")}function L(a,b){var c,d,e=_.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&_.extend(!0,a,d),a}function M(a,b,c){for(var d,e,f,g,h=a.contents,i=a.dataTypes;"*"===i[0];)i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function N(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];for(f=k.shift();f;)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+"
"+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}function O(a,b,c,d){var e;if(_.isArray(b))_.each(b,function(b,e){c||zc.test(a)?d(a,e):O(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==_.type(b))d(a,b);else for(e in b)O(a+"["+e+"]",b[e],c,d)}function P(a){return _.isWindow(a)?a:9===a.nodeType&&a.defaultView}var Q=[],R=Q.slice,S=Q.concat,T=Q.push,U=Q.indexOf,V={},W=V.toString,X=V.hasOwnProperty,Y={},Z=a.document,$="2.1.1",_=function(a,b){return new _.fn.init(a,b)},ab=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bb=/^-ms-/,cb=/-([\da-z])/gi,db=function(a,b){return b.toUpperCase()};_.fn=_.prototype={jquery:$,constructor:_,selector:"",length:0,toArray:function(){return R.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:R.call(this)},pushStack:function(a){var b
=_.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return _.each(this,a,b)},map:function(a){return this.pushStack(_.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(R.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:T,sort:Q.sort,splice:Q.splice},_.extend=_.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||_.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(_.isPlainObject(d)||(e=_.isArray(d)))?(e?(e=!1,f=c&&_.isArray(c)?c:[]):f=c&&_.isPlainObject(c)?c:{},g[b]=_.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},_.extend({e
xpando:"jQuery"+($+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===_.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!_.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==_.type(a)||a.nodeType||_.isWindow(a)?!1:a.constructor&&!X.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?V[W.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=_.trim(a),a&&(1===a.indexOf("use strict")?(b=Z.createElement("script"),b.text=a,Z.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(bb,"ms-").replace(cb,db)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.le
ngth,h=c(a);if(d){if(h)for(;g>f&&(e=b.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=b.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=b.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),e===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(ab,"")},makeArray:function(a,b){var d=b||[];return null!=a&&(c(Object(a))?_.merge(d,"string"==typeof a?[a]:a):T.call(d,a)),d},inArray:function(a,b,c){return null==b?-1:U.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,d){var e,f=0,g=a.length,h=c(a),i=[];if(h)for(;g>f;f++)e=b(a[f],f,d),null!=e&&i.push(e);else for(f in a)e=b(a[f],f,d),null!=e&&i.push(e);return S.apply([],i)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),_.isFunction(a)?(d=R.call(arguments,2),e=function(){return a.apply(b||t
his,d.concat(R.call(arguments)))},e.guid=a.guid=a.guid||_.guid++,e):void 0},now:Date.now,support:Y}),_.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){V["[object "+b+"]"]=b.toLowerCase()});var eb=function(a){function b(a,b,c,d){var e,f,g,h,i,j,l,n,o,p;if((b?b.ownerDocument||b:O)!==G&&F(b),b=b||G,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(I&&!d){if(e=sb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&M(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return _.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&v.getElementsByClassName&&b.getElementsByClassName)return _.apply(c,b.getElementsByClassName(g)),c}if(v.qsa&&(!J||!J.test(a))){if(n=l=N,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(j=z(a),(l=b.getAttribute("id"))?n=l.replace(ub,"\\$&"):b.setAttribute("id",
n),n="[id='"+n+"'] ",i=j.length;i--;)j[i]=n+m(j[i]);o=tb.test(a)&&k(b.parentNode)||b,p=j.join(",")}if(p)try{return _.apply(c,o.querySelectorAll(p)),c}catch(q){}finally{l||b.removeAttribute("id")}}}return B(a.replace(ib,"$1"),b,c,d)}function c(){function a(c,d){return b.push(c+" ")>w.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[N]=!0,a}function e(a){var b=G.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=a.length;d--;)w.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return d(fu
nction(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function k(a){return a&&typeof a.getElementsByTagName!==V&&a}function l(){}function m(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function n(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=Q++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[P,f];if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e){if(i=b[N]||(b[N]={}),(h=i[d])&&h[0]===P&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function o(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,c,d){for(var e=0,f=c.length;f>e;e++)b(a,c[e],d);return d}function q(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function r(a,b,c,e,f,g){return e&&!e[N]&&(e=
r(e)),f&&!f[N]&&(f=r(f,g)),d(function(d,g,h,i){var j,k,l,m=[],n=[],o=g.length,r=d||p(b||"*",h.nodeType?[h]:h,[]),s=!a||!d&&b?r:q(r,m,a,h,i),t=c?f||(d?a:o||e)?[]:g:s;if(c&&c(s,t,h,i),e)for(j=q(t,n),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[n[k]]=!(s[n[k]]=l));if(d){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?bb.call(d,l):m[k])>-1&&(d[j]=!(g[j]=l))}}else t=q(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function s(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return bb.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==C)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=w.relative[a[h].type])k=[n(o(k),c)];else{if(c=w.filter[a[h].type].apply(null,a[h].matches),c[N]){for(d=++h;e>d&&!w.relative[a[d].type];d++);return r(h>1&&o(k),h>1&&m(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ib,"$1"),
c,d>h&&s(a.slice(h,d)),e>d&&s(a=a.slice(d)),e>d&&m(a))}k.push(c)}return o(k)}function t(a,c){var e=c.length>0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],r=[],s=C,t=d||f&&w.find.TAG("*",j),u=P+=null==s?1:Math.random()||.1,v=t.length;for(j&&(C=g!==G&&g);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0;m=a[l++];)if(m(k,g,h)){i.push(k);break}j&&(P=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,r,g,h);if(d){if(n>0)for(;o--;)p[o]||r[o]||(r[o]=Z.call(i));r=q(r)}_.apply(i,r),j&&!d&&r.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(P=u,C=s),p};return e?d(g):g}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P=0,Q=0,R=c(),S=c(),T=c(),U=function(a,b){return a===b&&(E=!0),0},V="undefined",W=1<<31,X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,ab=Y.slice,bb=Y.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},cb="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hid
den|ismap|loop|multiple|open|readonly|required|scoped",db="[\\x20\\t\\r\\n\\f]",eb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",fb=eb.replace("w","w#"),gb="\\["+db+"*("+eb+")(?:"+db+"*([*^$|!~]?=)"+db+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+fb+"))|)"+db+"*\\]",hb=":("+eb+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+gb+")*)|.*)\\)|)",ib=new RegExp("^"+db+"+|((?:^|[^\\\\])(?:\\\\.)*)"+db+"+$","g"),jb=new RegExp("^"+db+"*,"+db+"*"),kb=new RegExp("^"+db+"*([>+~]|"+db+")"+db+"*"),lb=new RegExp("="+db+"*([^\\]'\"]*?)"+db+"*\\]","g"),mb=new RegExp(hb),nb=new RegExp("^"+fb+"$"),ob={ID:new RegExp("^#("+eb+")"),CLASS:new RegExp("^\\.("+eb+")"),TAG:new RegExp("^("+eb.replace("w","w*")+")"),ATTR:new RegExp("^"+gb),PSEUDO:new RegExp("^"+hb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+db+"*(even|odd|(([+-]|)(\\d*)n|)"+db+"*(?:([+-]|)"+db+"*(\\d+)|))"+db+"*\\)|)","i"),bool:new RegExp("^(?:"+cb+")$","i"),needsContext:
new RegExp("^"+db+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+db+"*((?:-\\d)?\\d*)"+db+"*\\)|)(?=[^-]|$)","i")},pb=/^(?:input|select|textarea|button)$/i,qb=/^h\d$/i,rb=/^[^{]+\{\s*\[native \w/,sb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tb=/[+~]/,ub=/'|\\/g,vb=new RegExp("\\\\([\\da-f]{1,6}"+db+"?|("+db+")|.)","ig"),wb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{_.apply(Y=ab.call(O.childNodes),O.childNodes),Y[O.childNodes.length].nodeType}catch(xb){_={apply:Y.length?function(a,b){$.apply(a,ab.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}v=b.support={},y=b.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},F=b.setDocument=function(a){var b,c=a?a.ownerDocument||a:O,d=c.defaultView;return c!==G&&9===c.nodeType&&c.documentElement?(G=c,H=c.documentElement,I=!y(c),d&&d!==d.top&&(d.addEventListener?d.addEventListener("u
nload",function(){F()},!1):d.attachEvent&&d.attachEvent("onunload",function(){F()})),v.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),v.getElementsByTagName=e(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),v.getElementsByClassName=rb.test(c.getElementsByClassName)&&e(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),v.getById=e(function(a){return H.appendChild(a).id=N,!c.getElementsByName||!c.getElementsByName(N).length}),v.getById?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&I){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){return a.getAttribute("id")===b}}):(delete w.find.ID,w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b
}}),w.find.TAG=v.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.CLASS=v.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==V&&I?b.getElementsByClassName(a):void 0},K=[],J=[],(v.qsa=rb.test(c.querySelectorAll))&&(e(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&J.push("[*^$]="+db+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||J.push("\\["+db+"*(?:value|"+cb+")"),a.querySelectorAll(":checked").length||J.push(":checked")}),e(function(a){var b=c.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&J.push("name"+db+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||J.push(":enabled",
":disabled"),a.querySelectorAll("*,:x"),J.push(",.*:")})),(v.matchesSelector=rb.test(L=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&e(function(a){v.disconnectedMatch=L.call(a,"div"),L.call(a,"[s!='']:x"),K.push("!=",hb)}),J=J.length&&new RegExp(J.join("|")),K=K.length&&new RegExp(K.join("|")),b=rb.test(H.compareDocumentPosition),M=b||rb.test(H.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=b?function(a,b){if(a===b)return E=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!v.sortDetached&&b.compareDocumentPosition(a)===d?a===c||a.ownerDocument===O&&M(O,a)?-1:b===c||b.ownerDocument===O&&M(O,b)?1
:D?bb.call(D,a)-bb.call(D,b):0:4&d?-1:1)}:function(a,b){if(a===b)return E=!0,0;var d,e=0,f=a.parentNode,h=b.parentNode,i=[a],j=[b];if(!f||!h)return a===c?-1:b===c?1:f?-1:h?1:D?bb.call(D,a)-bb.call(D,b):0;if(f===h)return g(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?g(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},c):G},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if((a.ownerDocument||a)!==G&&F(a),c=c.replace(lb,"='$1']"),!(!v.matchesSelector||!I||K&&K.test(c)||J&&J.test(c)))try{var d=L.call(a,c);if(d||v.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return b(c,G,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!==G&&F(a),M(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!==G&&F(a);var c=w.attrHandle[b.toLowerCase()],d=c&&X.call(w.attrHandle,b.toLowerCase())?c(a,b,!I):void 0;return void 0!==d?d:v.attributes||!I?a.getAttribute(b):(d=a.getAttribut
eNode(b))&&d.specified?d.value:null},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(E=!v.detectDuplicates,D=!v.sortStable&&a.slice(0),a.sort(U),E){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return D=null,a},x=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=x(b);return c},w=b.selectors={cacheLength:50,createPseudo:d,match:ob,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(vb,wb),a[3]=(a[3]||a[4]||a[5]||"").replace(vb,wb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice
(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return ob.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&mb.test(c)&&(b=z(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(vb,wb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=R[a+" "];return b||(b=new RegExp("(^|"+db+")"+a+"("+db+"|$)"))&&R(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:c?(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f+" ").indexOf(d)>-1:"|="===
c?f===d||f.slice(0,d.length+1)===d+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===P&&j[1],m=j[0]===P&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[P,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===P)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[P,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,c){var e,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||b.error("unsuppo
rted pseudo: "+a);return f[N]?f(c):f.length>1?(e=[a,a,"",c],w.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=bb.call(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=A(a.replace(ib,"$1"));return e[N]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:d(function(a){return nb.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(vb,wb).toLowerCase(),function(b){var c;do if(c=I?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},r
oot:function(a){return a===H},focus:function(a){return a===G.activeElement&&(!G.hasFocus||G.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return qb.test(a.nodeName)},input:function(a){return pb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:j(function(){return[0]}),last:j(function(a,b){return[b-1]}),eq:j(function(a,b,c){return[0>c?
c+b:c]}),even:j(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:j(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:j(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:j(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},w.pseudos.nth=w.pseudos.eq;for(u in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[u]=h(u);for(u in{submit:!0,reset:!0})w.pseudos[u]=i(u);return l.prototype=w.filters=w.pseudos,w.setFilters=new l,z=b.tokenize=function(a,c){var d,e,f,g,h,i,j,k=S[a+" "];if(k)return c?0:k.slice(0);for(h=a,i=[],j=w.preFilter;h;){(!d||(e=jb.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),d=!1,(e=kb.exec(h))&&(d=e.shift(),f.push({value:d,type:e[0].replace(ib," ")}),h=h.slice(d.length));for(g in w.filter)!(e=ob[g].exec(h))||j[g]&&!(e=j[g](e))||(d=e.shift(),f.push({value:d,type:g,matches:e}),h=h.slice(d.length));if(!d)break}return c?h.length:h?b.error(a):S(a,i).slice(0)},A=b.compile=function(a,b){var c,d=[],e=[],f=
T[a+" "];if(!f){for(b||(b=z(a)),c=b.length;c--;)f=s(b[c]),f[N]?d.push(f):e.push(f);f=T(a,t(e,d)),f.selector=a}return f},B=b.select=function(a,b,c,d){var e,f,g,h,i,j="function"==typeof a&&a,l=!d&&z(a=j.selector||a);if(c=c||[],1===l.length){if(f=l[0]=l[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&v.getById&&9===b.nodeType&&I&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(vb,wb),b)||[])[0],!b)return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=ob.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(vb,wb),tb.test(f[0].type)&&k(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return _.apply(c,d),c;break}}return(j||A(a,l))(d,b,!I,c,tb.test(a)&&k(b.parentNode)||b),c},v.sortStable=N.split("").sort(U).join("")===N,v.detectDuplicates=!!E,F(),v.sortDetached=e(function(a){return 1&a.compareDocumentPosition(G.createElement("div"))}),e(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firs
tChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),v.attributes&&e(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(cb,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);_.find=eb,_.expr=eb.selectors,_.expr[":"]=_.expr.pseudos,_.unique=eb.uniqueSort,_.text=eb.getText,_.isXMLDoc=eb.isXML,_.contains=eb.contains;var fb=_.expr.match.needsContext,gb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,hb=/^.[^:#\[\.,]*$/;_.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?_.find.matchesSelector(d,a)?[d]:[]:_.find.matches(a,_.grep(b,function(a){return 1===a.nodeType}))},_.fn.extend({find:fu
nction(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(_(a).filter(function(){for(b=0;c>b;b++)if(_.contains(e[b],this))return!0
-}));for(b=0;c>b;b++)_.find(a,e[b],d);return d=this.pushStack(c>1?_.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(d(this,a||[],!1))},not:function(a){return this.pushStack(d(this,a||[],!0))},is:function(a){return!!d(this,"string"==typeof a&&fb.test(a)?_(a):a||[],!1).length}});var ib,jb=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,kb=_.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:jb.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||ib).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof _?b[0]:b,_.merge(this,_.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:Z,!0)),gb.test(c[1])&&_.isPlainObject(b))for(c in b)_.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=Z.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=Z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this)
:_.isFunction(a)?"undefined"!=typeof ib.ready?ib.ready(a):a(_):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),_.makeArray(a,this))};kb.prototype=_.fn,ib=_(Z);var lb=/^(?:parents|prev(?:Until|All))/,mb={children:!0,contents:!0,next:!0,prev:!0};_.extend({dir:function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&_(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),_.fn.extend({has:function(a){var b=_(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(_.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=fb.test(a)||"string"!=typeof a?_(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&_.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?_.unique(f):f)},index:function(a){return a?"string"==type
of a?U.call(_(a),this[0]):U.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(_.unique(_.merge(this.get(),_(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),_.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return _.dir(a,"parentNode")},parentsUntil:function(a,b,c){return _.dir(a,"parentNode",c)},next:function(a){return e(a,"nextSibling")},prev:function(a){return e(a,"previousSibling")},nextAll:function(a){return _.dir(a,"nextSibling")},prevAll:function(a){return _.dir(a,"previousSibling")},nextUntil:function(a,b,c){return _.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return _.dir(a,"previousSibling",c)},siblings:function(a){return _.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return _.sibling(a.firstChild)},contents:function(a){return a.contentDocument||_.merge([],a.childNodes)}},f
unction(a,b){_.fn[a]=function(c,d){var e=_.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=_.filter(d,e)),this.length>1&&(mb[a]||_.unique(e),lb.test(a)&&e.reverse()),this.pushStack(e)}});var nb=/\S+/g,ob={};_.Callbacks=function(a){a="string"==typeof a?ob[a]||f(a):_.extend({},a);var b,c,d,e,g,h,i=[],j=!a.once&&[],k=function(f){for(b=a.memory&&f,c=!0,h=e||0,e=0,g=i.length,d=!0;i&&g>h;h++)if(i[h].apply(f[0],f[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,i&&(j?j.length&&k(j.shift()):b?i=[]:l.disable())},l={add:function(){if(i){var c=i.length;!function f(b){_.each(b,function(b,c){var d=_.type(c);"function"===d?a.unique&&l.has(c)||i.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),d?g=i.length:b&&(e=c,k(b))}return this},remove:function(){return i&&_.each(arguments,function(a,b){for(var c;(c=_.inArray(b,i,c))>-1;)i.splice(c,1),d&&(g>=c&&g--,h>=c&&h--)}),this},has:function(a){return a?_.inArray(a,i)>-1:!(!i||!i.length)},empty:function(){return i=[],g=0,this},disa
ble:function(){return i=j=b=void 0,this},disabled:function(){return!i},lock:function(){return j=void 0,b||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return!i||c&&!j||(b=b||[],b=[a,b.slice?b.slice():b],d?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!c}};return l},_.extend({Deferred:function(a){var b=[["resolve","done",_.Callbacks("once memory"),"resolved"],["reject","fail",_.Callbacks("once memory"),"rejected"],["notify","progress",_.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return _.Deferred(function(c){_.each(b,function(b,f){var g=_.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&_.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:f
unction(a){return null!=a?_.extend(a,d):d}},e={};return d.pipe=d.then,_.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b,c,d,e=0,f=R.call(arguments),g=f.length,h=1!==g||a&&_.isFunction(a.promise)?g:0,i=1===h?a:_.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?R.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);g>e;e++)f[e]&&_.isFunction(f[e].promise)?f[e].promise().done(j(e,d,f)).fail(i.reject).progress(j(e,c,b)):--h;return h||i.resolveWith(d,f),i.promise()}});var pb;_.fn.ready=function(a){return _.ready.promise().done(a),this},_.extend({isReady:!1,readyWait:1,holdReady:function(a){a?_.readyWait++:_.ready(!0)},ready:function(a){(a===!0?--_.readyWait:_.isReady)||(_
.isReady=!0,a!==!0&&--_.readyWait>0||(pb.resolveWith(Z,[_]),_.fn.triggerHandler&&(_(Z).triggerHandler("ready"),_(Z).off("ready"))))}}),_.ready.promise=function(b){return pb||(pb=_.Deferred(),"complete"===Z.readyState?setTimeout(_.ready):(Z.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1))),pb.promise(b)},_.ready.promise();var qb=_.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===_.type(c)){e=!0;for(h in c)_.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,_.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(_(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};_.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType},h.uid=1,h.accepts=_.acceptData,h.prototype={key:function(a){if(!h.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=h.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=
c,_.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(_.isEmptyObject(f))_.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,_.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{_.isArray(b)?d=b.concat(b.map(_.camelCase)):(e=_.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(nb)||[])),c=d.length;for(;c--;)delete g[d[c]]}},hasData:function(a){return!_.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var rb=new h,sb=new h,tb=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ub=/([A-Z])/g;_.extend({hasData:function(a){return sb.hasD
ata(a)||rb.hasData(a)},data:function(a,b,c){return sb.access(a,b,c)},removeData:function(a,b){sb.remove(a,b)},_data:function(a,b,c){return rb.access(a,b,c)},_removeData:function(a,b){rb.remove(a,b)}}),_.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=sb.get(f),1===f.nodeType&&!rb.get(f,"hasDataAttrs"))){for(c=g.length;c--;)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=_.camelCase(d.slice(5)),i(f,d,e[d])));rb.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){sb.set(this,a)}):qb(this,function(b){var c,d=_.camelCase(a);if(f&&void 0===b){if(c=sb.get(f,a),void 0!==c)return c;if(c=sb.get(f,d),void 0!==c)return c;if(c=i(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=sb.get(this,d);sb.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&sb.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){sb.remove(this,a)})}}),_.extend({queue:function(a,b,c){v
ar d;return a?(b=(b||"fx")+"queue",d=rb.get(a,b),c&&(!d||_.isArray(c)?d=rb.access(a,b,_.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=_.queue(a,b),d=c.length,e=c.shift(),f=_._queueHooks(a,b),g=function(){_.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return rb.get(a,c)||rb.access(a,c,{empty:_.Callbacks("once memory").add(function(){rb.remove(a,[b+"queue",c])})})}}),_.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?_.queue(this[0],a):void 0===b?this:this.each(function(){var c=_.queue(this,a,b);_._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&_.dequeue(this,a)})},dequeue:function(a){return this.each(function(){_.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=_.Deferred(),f=this,g=this.length,h=funct
ion(){--d||e.resolveWith(f,[f])};for("string"!=typeof a&&(b=a,a=void 0),a=a||"fx";g--;)c=rb.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var vb=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,wb=["Top","Right","Bottom","Left"],xb=function(a,b){return a=b||a,"none"===_.css(a,"display")||!_.contains(a.ownerDocument,a)},yb=/^(?:checkbox|radio)$/i;!function(){var a=Z.createDocumentFragment(),b=a.appendChild(Z.createElement("div")),c=Z.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),Y.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",Y.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var zb="undefined";Y.focusinBubbles="onfocusin"in a;var Ab=/^key/,Bb=/^(?:mouse|pointer|contextmenu)|click/,Cb=/^(?:focusinfocus|focusoutblur)$/,Db=/^([^.]*)(?:\.(.+)|)$/;_.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,
m,n,o,p,q=rb.get(a);if(q)for(c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=_.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return typeof _!==zb&&_.event.triggered!==b.type?_.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(nb)||[""],j=b.length;j--;)h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=_.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=_.event.special[n]||{},k=_.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&_.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),_.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=rb.hasData(a)&&rb.get(a);if(q&&(i=q.events)){for(b=(b||"").match(nb)||[""],j=b.length;j--;
)if(h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=_.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||_.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)_.event.remove(a,n+b[j],c,d,!0);_.isEmptyObject(i)&&(delete q.handle,rb.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m=[d||Z],n=X.call(b,"type")?b.type:b,o=X.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||Z,3!==d.nodeType&&8!==d.nodeType&&!Cb.test(n+_.event.triggered)&&(n.indexOf(".")>=0&&(o=n.split("."),n=o.shift(),o.sort()),j=n.indexOf(":")<0&&"on"+n,b=b[_.expando]?b:new _.Event(n,"object"==typeof b&&b),b.isTrigger=e?2:3,b.n
amespace=o.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:_.makeArray(c,[b]),l=_.event.special[n]||{},e||!l.trigger||l.trigger.apply(d,c)!==!1)){if(!e&&!l.noBubble&&!_.isWindow(d)){for(i=l.delegateType||n,Cb.test(i+n)||(g=g.parentNode);g;g=g.parentNode)m.push(g),h=g;h===(d.ownerDocument||Z)&&m.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=m[f++])&&!b.isPropagationStopped();)b.type=f>1?i:l.bindType||n,k=(rb.get(g,"events")||{})[b.type]&&rb.get(g,"handle"),k&&k.apply(g,c),k=j&&g[j],k&&k.apply&&_.acceptData(g)&&(b.result=k.apply(g,c),b.result===!1&&b.preventDefault());return b.type=n,e||b.isDefaultPrevented()||l._default&&l._default.apply(m.pop(),c)!==!1||!_.acceptData(d)||j&&_.isFunction(d[n])&&!_.isWindow(d)&&(h=d[j],h&&(d[j]=null),_.event.triggered=n,d[n](),_.event.triggered=void 0,h&&(d[j]=h)),b.result}},dispatch:function(a){a=_.event.fix(a);var b,c,d,e,f,g=[],h=R.call(argume
nts),i=(rb.get(this,"events")||{})[a.type]||[],j=_.event.special[a.type]||{};if(h[0]=a,a.delegateTarget=this,!j.preDispatch||j.preDispatch.call(this,a)!==!1){for(g=_.event.handlers.call(this,a,i),b=0;(e=g[b++])&&!a.isPropagationStopped();)for(a.currentTarget=e.elem,c=0;(f=e.handlers[c++])&&!a.isImmediatePropagationStopped();)(!a.namespace_re||a.namespace_re.test(f.namespace))&&(a.handleObj=f,a.data=f.data,d=((_.event.special[f.origType]||{}).handle||f.handler).apply(e.elem,h),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return j.postDispatch&&j.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?_(e,this).index(i)>=0:_.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}re
turn h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||Z,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[_.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];for(g||(this.fixHooks[e]=g=Bb.test(e)?this.mouseHooks:Ab.tes
t(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new _.Event(f),b=d.length;b--;)c=d[b],a[c]=f[c];return a.target||(a.target=Z),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==l()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===l()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&_.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return _.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=_.extend(new _.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?_.event.trigger(e,null,b):_.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},_.removeEvent=function(a,b,c){a.removeE
ventListener&&a.removeEventListener(b,c,!1)},_.Event=function(a,b){return this instanceof _.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?j:k):this.type=a,b&&_.extend(this,b),this.timeStamp=a&&a.timeStamp||_.now(),void(this[_.expando]=!0)):new _.Event(a,b)},_.Event.prototype={isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=j,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=j,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=j,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},_.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,
b){_.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!_.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),Y.focusinBubbles||_.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){_.event.simulate(b,a.target,_.event.fix(a),!0)};_.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=rb.access(d,b);e||d.addEventListener(a,c,!0),rb.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=rb.access(d,b)-1;e?rb.access(d,b,e):(d.removeEventListener(a,c,!0),rb.remove(d,b))}}}),_.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=k;else if(!d)return this;return 1===e&&(f=d,d=function(a){return _().off(a),f.apply(this,arguments)
},d.guid=f.guid||(f.guid=_.guid++)),this.each(function(){_.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,_(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=k),this.each(function(){_.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){_.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?_.event.trigger(a,b,c,!0):void 0}});var Eb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Fb=/<([\w:]+)/,Gb=/<|&#?\w+;/,Hb=/<(?:script|style|link)/i,Ib=/checked\s*(?:[^=]|=\s*.checked.)/i,Jb=/^$|\/(?:java|ecma)script/i,Kb=/^true\/(.*)/,Lb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Mb={option:[1,"<select multiple='multiple'>","</selec
t>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Mb.optgroup=Mb.option,Mb.tbody=Mb.tfoot=Mb.colgroup=Mb.caption=Mb.thead,Mb.th=Mb.td,_.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=_.contains(a.ownerDocument,a);if(!(Y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||_.isXMLDoc(a)))for(g=r(h),f=r(a),d=0,e=f.length;e>d;d++)s(f[d],g[d]);if(b)if(c)for(f=f||r(a),g=g||r(h),d=0,e=f.length;e>d;d++)q(f[d],g[d]);else q(a,h);return g=r(h,"script"),g.length>0&&p(g,!i&&r(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===_.type(e))_.merge(l,e.nodeType?[e]:e);else if(Gb.test(e)){for(f=f||k.appendChild(b.createElement("div")),g=(Fb.exec(e)||["",""])[1].toLowerCase(),h=Mb[g]||Mb._default,f.innerHTML=h[1]+e.replace(Eb,"<$1></$2>"
)+h[2],j=h[0];j--;)f=f.lastChild;_.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));for(k.textContent="",m=0;e=l[m++];)if((!d||-1===_.inArray(e,d))&&(i=_.contains(e.ownerDocument,e),f=r(k.appendChild(e),"script"),i&&p(f),c))for(j=0;e=f[j++];)Jb.test(e.type||"")&&c.push(e);return k},cleanData:function(a){for(var b,c,d,e,f=_.event.special,g=0;void 0!==(c=a[g]);g++){if(_.acceptData(c)&&(e=c[rb.expando],e&&(b=rb.cache[e]))){if(b.events)for(d in b.events)f[d]?_.event.remove(c,d):_.removeEvent(c,d,b.handle);rb.cache[e]&&delete rb.cache[e]}delete sb.cache[c[sb.expando]]}}}),_.fn.extend({text:function(a){return qb(this,function(a){return void 0===a?_.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.appendChild(a)}})}
,prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?_.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||_.cleanData(r(c)),c.parentNode&&(b&&_.contains(c.ownerDocument,c)&&p(r(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(_.cleanData(r(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return _.clone(this,a,b)})},html:function(a){return qb(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.inner
HTML;if("string"==typeof a&&!Hb.test(a)&&!Mb[(Fb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Eb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(_.cleanData(r(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,_.cleanData(r(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=S.apply([],a);var c,d,e,f,g,h,i=0,j=this.length,k=this,l=j-1,m=a[0],p=_.isFunction(m);if(p||j>1&&"string"==typeof m&&!Y.checkClone&&Ib.test(m))return this.each(function(c){var d=k.eq(c);p&&(a[0]=m.call(this,c,d.html())),d.domManip(a,b)});if(j&&(c=_.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(e=_.map(r(c,"script"),n),f=e.length;j>i;i++)g=c,i!==l&&(g=_.clone(g,!0,!0),f&&_.merge(e,r(g,"script"))),b.call(th
is[i],g,i);if(f)for(h=e[e.length-1].ownerDocument,_.map(e,o),i=0;f>i;i++)g=e[i],Jb.test(g.type||"")&&!rb.access(g,"globalEval")&&_.contains(h,g)&&(g.src?_._evalUrl&&_._evalUrl(g.src):_.globalEval(g.textContent.replace(Lb,"")))}return this}}),_.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){_.fn[a]=function(a){for(var c,d=[],e=_(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),_(e[g])[b](c),T.apply(d,c.get());return this.pushStack(d)}});var Nb,Ob={},Pb=/^margin/,Qb=new RegExp("^("+vb+")(?!px)[a-z%]+$","i"),Rb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};!function(){function b(){g.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",g.innerHTML="",e.appendChild(f);var b=a.getComputedStyle(g,null);c="1%"!==b.top,d="4px"===b.width,e.removeChild(f)}
var c,d,e=Z.documentElement,f=Z.createElement("div"),g=Z.createElement("div");g.style&&(g.style.backgroundClip="content-box",g.cloneNode(!0).style.backgroundClip="",Y.clearCloneStyle="content-box"===g.style.backgroundClip,f.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",f.appendChild(g),a.getComputedStyle&&_.extend(Y,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return null==d&&b(),d},reliableMarginRight:function(){var b,c=g.appendChild(Z.createElement("div"));return c.style.cssText=g.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",g.style.width="1px",e.appendChild(f),b=!parseFloat(a.getComputedStyle(c,null).marginRight),e.removeChild(f),b}}))}(),_.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var S
b=/^(none|table(?!-c[ea]).+)/,Tb=new RegExp("^("+vb+")(.*)$","i"),Ub=new RegExp("^([+-])=("+vb+")","i"),Vb={position:"absolute",visibility:"hidden",display:"block"},Wb={letterSpacing:"0",fontWeight:"400"},Xb=["Webkit","O","Moz","ms"];_.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=v(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=_.camelCase(b),i=a.style;return b=_.cssProps[h]||(_.cssProps[h]=x(i,h)),g=_.cssHooks[b]||_.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ub.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(_.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||_.cssNumber[h]||(c+="px"),Y.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g
&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=_.camelCase(b);return b=_.cssProps[h]||(_.cssProps[h]=x(a.style,h)),g=_.cssHooks[b]||_.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=v(a,b,d)),"normal"===e&&b in Wb&&(e=Wb[b]),""===c||c?(f=parseFloat(e),c===!0||_.isNumeric(f)?f||0:e):e}}),_.each(["height","width"],function(a,b){_.cssHooks[b]={get:function(a,c,d){return c?Sb.test(_.css(a,"display"))&&0===a.offsetWidth?_.swap(a,Vb,function(){return A(a,b,d)}):A(a,b,d):void 0},set:function(a,c,d){var e=d&&Rb(a);return y(a,c,d?z(a,b,d,"border-box"===_.css(a,"boxSizing",!1,e),e):0)}}}),_.cssHooks.marginRight=w(Y.reliableMarginRight,function(a,b){return b?_.swap(a,{display:"inline-block"},v,[a,"marginRight"]):void 0}),_.each({margin:"",padding:"",border:"Width"},function(a,b){_.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+wb[d]+b]=f[d]||f[d-2]||f[0];return e}},Pb.test(a)||(_.cssHooks[a+b].
set=y)}),_.fn.extend({css:function(a,b){return qb(this,function(a,b,c){var d,e,f={},g=0;if(_.isArray(b)){for(d=Rb(a),e=b.length;e>g;g++)f[b[g]]=_.css(a,b[g],!1,d);return f}return void 0!==c?_.style(a,b,c):_.css(a,b)},a,b,arguments.length>1)},show:function(){return B(this,!0)},hide:function(){return B(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){xb(this)?_(this).show():_(this).hide()})}}),_.Tween=C,C.prototype={constructor:C,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(_.cssNumber[c]?"":"px")},cur:function(){var a=C.propHooks[this.prop];return a&&a.get?a.get(this):C.propHooks._default.get(this)},run:function(a){var b,c=C.propHooks[this.prop];return this.pos=b=this.options.duration?_.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.s
tep.call(this.elem,this.now,this),c&&c.set?c.set(this):C.propHooks._default.set(this),this}},C.prototype.init.prototype=C.prototype,C.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=_.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){_.fx.step[a.prop]?_.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[_.cssProps[a.prop]]||_.cssHooks[a.prop])?_.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},C.propHooks.scrollTop=C.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},_.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},_.fx=C.prototype.init,_.fx.step={};var Yb,Zb,$b=/^(?:toggle|show|hide)$/,_b=new RegExp("^(?:([+-])=|)("+vb+")([a-z%]*)$","i"),ac=/queueHooks$/,bc=[G],cc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=_b.exec(b),f=e&&e[3]||(_.cssNumber[a]?"":"px"),g=(_.cssNumber[a]||"px"!=
=f&&+d)&&_b.exec(_.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,_.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};_.Animation=_.extend(I,{tweener:function(a,b){_.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],cc[c]=cc[c]||[],cc[c].unshift(b)},prefilter:function(a,b){b?bc.unshift(a):bc.push(a)}}),_.speed=function(a,b,c){var d=a&&"object"==typeof a?_.extend({},a):{complete:c||!c&&b||_.isFunction(a)&&a,duration:a,easing:c&&b||b&&!_.isFunction(b)&&b};return d.duration=_.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in _.fx.speeds?_.fx.speeds[d.duration]:_.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){_.isFunction(d.old)&&d.old.call(this),d.queue&&_.dequeue(this,d.queue)},d},_.fn.extend({fadeTo:function(a,b,c,d){return this.filter(xb).css("opacity",0).show()
.end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=_.isEmptyObject(a),f=_.speed(b,c,d),g=function(){var b=I(this,_.extend({},a),f);(e||rb.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=_.timers,g=rb.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ac.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&_.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=rb.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=_.timers,g=d?d.length:0;for(c.finish=!0,_.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.spli
ce(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),_.each(["toggle","show","hide"],function(a,b){var c=_.fn[b];
-_.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(E(b,!0),a,d,e)}}),_.each({slideDown:E("show"),slideUp:E("hide"),slideToggle:E("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){_.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),_.timers=[],_.fx.tick=function(){var a,b=0,c=_.timers;for(Yb=_.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||_.fx.stop(),Yb=void 0},_.fx.timer=function(a){_.timers.push(a),a()?_.fx.start():_.timers.pop()},_.fx.interval=13,_.fx.start=function(){Zb||(Zb=setInterval(_.fx.tick,_.fx.interval))},_.fx.stop=function(){clearInterval(Zb),Zb=null},_.fx.speeds={slow:600,fast:200,_default:400},_.fn.delay=function(a,b){return a=_.fx?_.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=Z.createElement("input"),b=Z.createElement("select"),c=b.appendChild(Z.createEleme
nt("option"));a.type="checkbox",Y.checkOn=""!==a.value,Y.optSelected=c.selected,b.disabled=!0,Y.optDisabled=!c.disabled,a=Z.createElement("input"),a.value="t",a.type="radio",Y.radioValue="t"===a.value}();var dc,ec,fc=_.expr.attrHandle;_.fn.extend({attr:function(a,b){return qb(this,_.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){_.removeAttr(this,a)})}}),_.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===zb?_.prop(a,b,c):(1===f&&_.isXMLDoc(a)||(b=b.toLowerCase(),d=_.attrHooks[b]||(_.expr.match.bool.test(b)?ec:dc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=_.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void _.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(nb);if(f&&1===a.nodeType)for(;c=f[e++];)d=_.propFix[c]||c,_.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:functio
n(a,b){if(!Y.radioValue&&"radio"===b&&_.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),ec={set:function(a,b,c){return b===!1?_.removeAttr(a,c):a.setAttribute(c,c),c}},_.each(_.expr.match.bool.source.match(/\w+/g),function(a,b){var c=fc[b]||_.find.attr;fc[b]=function(a,b,d){var e,f;return d||(f=fc[b],fc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,fc[b]=f),e}});var gc=/^(?:input|select|textarea|button)$/i;_.fn.extend({prop:function(a,b){return qb(this,_.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[_.propFix[a]||a]})}}),_.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!_.isXMLDoc(a),f&&(b=_.propFix[b]||b,e=_.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||gc.test(a.n
odeName)||a.href?a.tabIndex:-1}}}}),Y.optSelected||(_.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),_.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){_.propFix[this.toLowerCase()]=this});var hc=/[\t\r\n\f]/g;_.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):" ")){for(f=0;e=b[f++];)d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=_.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).removeClass(a.call(this,b,this.classNa
me))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):"")){for(f=0;e=b[f++];)for(;d.indexOf(" "+e+" ")>=0;)d=d.replace(" "+e+" "," ");g=a?_.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(_.isFunction(a)?function(c){_(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c)for(var b,d=0,e=_(this),f=a.match(nb)||[];b=f[d++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else(c===zb||"boolean"===c)&&(this.className&&rb.set(this,"__className__",this.className),this.className=this.className||a===!1?"":rb.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(hc," ").indexOf(b)>=0)return!0;return!1}});var ic=/\r/g;_.fn.extend({val:function(a){var b
,c,d,e=this[0];{if(arguments.length)return d=_.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,_(this).val()):a,null==e?e="":"number"==typeof e?e+="":_.isArray(e)&&(e=_.map(e,function(a){return null==a?"":a+""})),b=_.valHooks[this.type]||_.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=_.valHooks[e.type]||_.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ic,""):null==c?"":c)}}}),_.extend({valHooks:{option:{get:function(a){var b=_.find.attr(a,"value");return null!=b?b:_.trim(_.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(Y.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&_.nodeName(c.parentNode,"optgroup"))){if(b=_(c).val(),f)return b;g.p
ush(b)}return g},set:function(a,b){for(var c,d,e=a.options,f=_.makeArray(b),g=e.length;g--;)d=e[g],(d.selected=_.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),_.each(["radio","checkbox"],function(){_.valHooks[this]={set:function(a,b){return _.isArray(b)?a.checked=_.inArray(_(a).val(),b)>=0:void 0}},Y.checkOn||(_.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),_.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){_.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),_.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){
return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var jc=_.now(),kc=/\?/;_.parseJSON=function(a){return JSON.parse(a+"")},_.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&_.error("Invalid XML: "+a),b};var lc,mc,nc=/#.*$/,oc=/([?&])_=[^&]*/,pc=/^(.*?):[ \t]*([^\r\n]*)$/gm,qc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rc=/^(?:GET|HEAD)$/,sc=/^\/\//,tc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,uc={},vc={},wc="*/".concat("*");try{mc=location.href}catch(xc){mc=Z.createElement("a"),mc.href="",mc=mc.href}lc=tc.exec(mc.toLowerCase())||[],_.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:mc,type:"GET",isLocal:qc.test(lc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":wc,text:"text/plain",html:"text/html",xml:"appli
cation/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":_.parseJSON,"text xml":_.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?L(L(a,_.ajaxSettings),b):L(_.ajaxSettings,a)},ajaxPrefilter:J(uc),ajaxTransport:J(vc),ajax:function(a,b){function c(a,b,c,g){var i,k,r,s,u,w=b;2!==t&&(t=2,h&&clearTimeout(h),d=void 0,f=g||"",v.readyState=a>0?4:0,i=a>=200&&300>a||304===a,c&&(s=M(l,v,c)),s=N(l,s,v,i),i?(l.ifModified&&(u=v.getResponseHeader("Last-Modified"),u&&(_.lastModified[e]=u),u=v.getResponseHeader("etag"),u&&(_.etag[e]=u)),204===a||"HEAD"===l.type?w="nocontent":304===a?w="notmodified":(w=s.state,k=s.data,r=s.error,i=!r)):(r=w,(a||!w)&&(w="error",0>a&&(a=0))),v.status=a,v.statusText=(b||w)+"",i?o.resolveWith(m,[k,w,v]):o.rejectWith(m,[v,w,r]),v.statusCode(q),q=void 0,j&&n.trigger(
i?"ajaxSuccess":"ajaxError",[v,l,i?k:r]),p.fireWith(m,[v,w]),j&&(n.trigger("ajaxComplete",[v,l]),--_.active||_.event.trigger("ajaxStop")))}"object"==typeof a&&(b=a,a=void 0),b=b||{};var d,e,f,g,h,i,j,k,l=_.ajaxSetup({},b),m=l.context||l,n=l.context&&(m.nodeType||m.jquery)?_(m):_.event,o=_.Deferred(),p=_.Callbacks("once memory"),q=l.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!g)for(g={};b=pc.exec(f);)g[b[1].toLowerCase()]=b[2];b=g[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return d&&d.abort(b),c(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,l.url=((a||l.url
||mc)+"").replace(nc,"").replace(sc,lc[1]+"//"),l.type=b.method||b.type||l.method||l.type,l.dataTypes=_.trim(l.dataType||"*").toLowerCase().match(nb)||[""],null==l.crossDomain&&(i=tc.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]===lc[1]&&i[2]===lc[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(lc[3]||("http:"===lc[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=_.param(l.data,l.traditional)),K(uc,l,b,v),2===t)return v;j=l.global,j&&0===_.active++&&_.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!rc.test(l.type),e=l.url,l.hasContent||(l.data&&(e=l.url+=(kc.test(e)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=oc.test(e)?e.replace(oc,"$1_="+jc++):e+(kc.test(e)?"&":"?")+"_="+jc++)),l.ifModified&&(_.lastModified[e]&&v.setRequestHeader("If-Modified-Since",_.lastModified[e]),_.etag[e]&&v.setRequestHeader("If-None-Match",_.etag[e])),(l.data&&l.hasContent&&l.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",l.contentTy
pe),v.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+wc+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)v.setRequestHeader(k,l.headers[k]);if(l.beforeSend&&(l.beforeSend.call(m,v,l)===!1||2===t))return v.abort();u="abort";for(k in{success:1,error:1,complete:1})v[k](l[k]);if(d=K(vc,l,b,v)){v.readyState=1,j&&n.trigger("ajaxSend",[v,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){v.abort("timeout")},l.timeout));try{t=1,d.send(r,c)}catch(w){if(!(2>t))throw w;c(-1,w)}}else c(-1,"No Transport");return v},getJSON:function(a,b,c){return _.get(a,b,c,"json")},getScript:function(a,b){return _.get(a,void 0,b,"script")}}),_.each(["get","post"],function(a,b){_[b]=function(a,c,d,e){return _.isFunction(c)&&(e=e||d,d=c,c=void 0),_.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){_.fn[b]=function(a){return this.on(b,a)}}),_
._evalUrl=function(a){return _.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},_.fn.extend({wrapAll:function(a){var b;return _.isFunction(a)?this.each(function(b){_(this).wrapAll(a.call(this,b))}):(this[0]&&(b=_(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(_.isFunction(a)?function(b){_(this).wrapInner(a.call(this,b))}:function(){var b=_(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=_.isFunction(a);return this.each(function(c){_(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){_.nodeName(this,"body")||_(this).replaceWith(this.childNodes)}).end()}}),_.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},_.expr.filters.visible=function(a){return!_.expr.filters.hidden(a)};var yc
=/%20/g,zc=/\[\]$/,Ac=/\r?\n/g,Bc=/^(?:submit|button|image|reset|file)$/i,Cc=/^(?:input|select|textarea|keygen)/i;_.param=function(a,b){var c,d=[],e=function(a,b){b=_.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=_.ajaxSettings&&_.ajaxSettings.traditional),_.isArray(a)||a.jquery&&!_.isPlainObject(a))_.each(a,function(){e(this.name,this.value)});else for(c in a)O(c,a[c],b,e);return d.join("&").replace(yc,"+")},_.fn.extend({serialize:function(){return _.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=_.prop(this,"elements");return a?_.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!_(this).is(":disabled")&&Cc.test(this.nodeName)&&!Bc.test(a)&&(this.checked||!yb.test(a))}).map(function(a,b){var c=_(this).val();return null==c?null:_.isArray(c)?_.map(c,function(a){return{name:b.name,value:a.replace(Ac,"\r\n")}}):{name:b.name,value:c.replace(Ac,"\r\n")}}).get()
}}),_.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Dc=0,Ec={},Fc={0:200,1223:204},Gc=_.ajaxSettings.xhr();a.ActiveXObject&&_(a).on("unload",function(){for(var a in Ec)Ec[a]()}),Y.cors=!!Gc&&"withCredentials"in Gc,Y.ajax=Gc=!!Gc,_.ajaxTransport(function(a){var b;return Y.cors||Gc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Dc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Ec[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Fc[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Ec[g]=b("abort");try{f.send(a.hasContent&&a
.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),_.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return _.globalEval(a),a}}}),_.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),_.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=_("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),Z.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Hc=[],Ic=/(=)\?(?=&|$)|\?\?/;_.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Hc.pop()||_.expando+"_"+jc++;return this[a]=!0,a}}),_.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ic.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("app
lication/x-www-form-urlencoded")&&Ic.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=_.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ic,"$1"+e):b.jsonp!==!1&&(b.url+=(kc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||_.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Hc.push(e)),g&&_.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),_.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||Z;var d=gb.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=_.buildFragment([a],b,e),e&&e.length&&_(e).remove(),_.merge([],d.childNodes))};var Jc=_.fn.load;_.fn.load=function(a,b,c){if("string"!=typeof a&&Jc)return Jc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=_.trim(a.slice(h)),a=a.slice(0,h)),_.isFunction(b)
?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&_.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?_("<div>").append(_.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},_.expr.filters.animated=function(a){return _.grep(_.timers,function(b){return a===b.elem}).length};var Kc=a.document.documentElement;_.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=_.css(a,"position"),l=_(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=_.css(a,"top"),i=_.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),_.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},_.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){_.offset.setOffset(this,a,b)});var b,c,d=t
his[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,_.contains(b,d)?(typeof d.getBoundingClientRect!==zb&&(e=d.getBoundingClientRect()),c=P(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===_.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),_.nodeName(a[0],"html")||(d=a.offset()),d.top+=_.css(a[0],"borderTopWidth",!0),d.left+=_.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-_.css(c,"marginTop",!0),left:b.left-d.left-_.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||Kc;a&&!_.nodeName(a,"html")&&"static"===_.css(a,"position");)a=a.offsetParent;return a||Kc})}}),_.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;_.fn[b]=function(e){return qb(this,function(b,e,f){var g=P(b);return void 0===f?g?g[c]:b[e]:void(
g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),_.each(["top","left"],function(a,b){_.cssHooks[b]=w(Y.pixelPosition,function(a,c){return c?(c=v(a,b),Qb.test(c)?_(a).position()[b]+"px":c):void 0})}),_.each({Height:"height",Width:"width"},function(a,b){_.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){_.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return qb(this,function(b,c,d){var e;return _.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?_.css(b,c,g):_.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),_.fn.size=function(){return this.length},_.fn.andSelf=_.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return _});var Lc=a.jQuery,Mc=a.$;return _.noConflict=function(b){return a.$===_&&(a.$=Mc),b&&a.jQuery
===_&&(a.jQuery=Lc),_},typeof b===zb&&(a.jQuery=a.$=_),_}),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.len
gth||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)
):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$elemen
t=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){
return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.b
<TRUNCATED>
[30/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/scripts/vendor.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/scripts/vendor.js b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/scripts/vendor.js
new file mode 100644
index 0000000..c4c3f2d
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/scripts/vendor.js
@@ -0,0 +1,10 @@
+if(function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b=a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(hb.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=ob[a]={};return _.each(a.match(nb)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.
cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ub,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:tb.test(c)?_.parseJSON(c):c}catch(e){}sb.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Kb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)rb.set(a[c],"globalEval",!b||rb.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(rb.hasData(a)&&(f=rb.access(a),g=rb.set(b
,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sb.hasData(a)&&(h=sb.access(a),i=_.extend({},h),sb.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&yb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Ob[a];return c||(c=t(a,b),"none"!==c&&c||(Nb=(Nb||_("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=Nb[0].contentDocument,b.write(),b.close(),c=t(a,b),Nb.detach()),Ob[a]=c),c}function v(a,b,c){var d,e,f,g,h=a.style;return c=c||Rb(a),c&&(g=c.getProp
ertyValue(b)||c[b]),c&&(""!==g||_.contains(a.ownerDocument,a)||(g=_.style(a,b)),Qb.test(g)&&Pb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function w(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function x(a,b){if(b in a)return b;for(var c=b[0].toUpperCase()+b.slice(1),d=b,e=Xb.length;e--;)if(b=Xb[e]+c,b in a)return b;return d}function y(a,b,c){var d=Tb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=_.css(a,c+wb[f],!0,e)),d?("content"===c&&(g-=_.css(a,"padding"+wb[f],!0,e)),"margin"!==c&&(g-=_.css(a,"border"+wb[f]+"Width",!0,e))):(g+=_.css(a,"padding"+wb[f],!0,e),"padding"!==c&&(g+=_.css(a,"border"+wb[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Rb(a),g="border-box"
===_.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=v(a,b,f),(0>e||null==e)&&(e=a.style[b]),Qb.test(e))return e;d=g&&(Y.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=rb.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&xb(d)&&(f[g]=rb.access(d,"olddisplay",u(d.nodeName)))):(e=xb(d),"none"===c&&e||rb.set(d,"olddisplay",e?c:_.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function C(a,b,c,d,e){return new C.prototype.init(a,b,c,d,e)}function D(){return setTimeout(function(){Yb=void 0}),Yb=_.now()}function E(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=wb[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function F(a,b,c){for(var d,e=(cc[b]||[]).concat(cc["*"]),f=0,g=e.l
ength;g>f;f++)if(d=e[f].call(c,b,a))return d}function G(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},n=a.style,o=a.nodeType&&xb(a),p=rb.get(a,"fxshow");c.queue||(h=_._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,_.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[n.overflow,n.overflowX,n.overflowY],j=_.css(a,"display"),k="none"===j?rb.get(a,"olddisplay")||u(a.nodeName):j,"inline"===k&&"none"===_.css(a,"float")&&(n.display="inline-block")),c.overflow&&(n.overflow="hidden",l.always(function(){n.overflow=c.overflow[0],n.overflowX=c.overflow[1],n.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],$b.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(o?"hide":"show")){if("show"!==e||!p||void 0===p[d])continue;o=!0}m[d]=p&&p[d]||_.style(a,d)}else j=void 0;if(_.isEmptyObject(m))"inline"===("none"===j?u(a.nodeName):j)&&(n.displ
ay=j);else{p?"hidden"in p&&(o=p.hidden):p=rb.access(a,"fxshow",{}),f&&(p.hidden=!o),o?_(a).show():l.done(function(){_(a).hide()}),l.done(function(){var b;rb.remove(a,"fxshow");for(b in m)_.style(a,b,m[b])});for(d in m)g=F(o?p[d]:0,d,l),d in p||(p[d]=g.start,o&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function H(a,b){var c,d,e,f,g;for(c in a)if(d=_.camelCase(c),e=b[d],f=a[c],_.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=_.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function I(a,b,c){var d,e,f=0,g=bc.length,h=_.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Yb||D(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:_.extend({},b),opts:_.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c
,startTime:Yb||D(),duration:c.duration,tweens:[],createTween:function(b,c){var d=_.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(H(k,j.opts.specialEasing);g>f;f++)if(d=bc[f].call(j,a,k,j.opts))return d;return _.map(k,F,j),_.isFunction(j.opts.start)&&j.opts.start.call(a,j),_.fx.timer(_.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function J(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(nb)||[];if(_.isFunction(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function K(a,b,c,d){function e(h){var i;return f[h]=!0,_.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeo
f j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===vc;return e(b.dataTypes[0])||!f["*"]&&e("*")}function L(a,b){var c,d,e=_.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&_.extend(!0,a,d),a}function M(a,b,c){for(var d,e,f,g,h=a.contents,i=a.dataTypes;"*"===i[0];)i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function N(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];for(f=k.shift();f;)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+"
"+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}function O(a,b,c,d){var e;if(_.isArray(b))_.each(b,function(b,e){c||zc.test(a)?d(a,e):O(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==_.type(b))d(a,b);else for(e in b)O(a+"["+e+"]",b[e],c,d)}function P(a){return _.isWindow(a)?a:9===a.nodeType&&a.defaultView}var Q=[],R=Q.slice,S=Q.concat,T=Q.push,U=Q.indexOf,V={},W=V.toString,X=V.hasOwnProperty,Y={},Z=a.document,$="2.1.1",_=function(a,b){return new _.fn.init(a,b)},ab=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bb=/^-ms-/,cb=/-([\da-z])/gi,db=function(a,b){return b.toUpperCase()};_.fn=_.prototype={jquery:$,constructor:_,selector:"",length:0,toArray:function(){return R.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:R.call(this)},pushStack:function(a){var b
=_.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return _.each(this,a,b)},map:function(a){return this.pushStack(_.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(R.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:T,sort:Q.sort,splice:Q.splice},_.extend=_.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||_.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(_.isPlainObject(d)||(e=_.isArray(d)))?(e?(e=!1,f=c&&_.isArray(c)?c:[]):f=c&&_.isPlainObject(c)?c:{},g[b]=_.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},_.extend({e
xpando:"jQuery"+($+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===_.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!_.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==_.type(a)||a.nodeType||_.isWindow(a)?!1:a.constructor&&!X.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?V[W.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=_.trim(a),a&&(1===a.indexOf("use strict")?(b=Z.createElement("script"),b.text=a,Z.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(bb,"ms-").replace(cb,db)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.le
ngth,h=c(a);if(d){if(h)for(;g>f&&(e=b.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=b.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=b.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),e===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(ab,"")},makeArray:function(a,b){var d=b||[];return null!=a&&(c(Object(a))?_.merge(d,"string"==typeof a?[a]:a):T.call(d,a)),d},inArray:function(a,b,c){return null==b?-1:U.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,d){var e,f=0,g=a.length,h=c(a),i=[];if(h)for(;g>f;f++)e=b(a[f],f,d),null!=e&&i.push(e);else for(f in a)e=b(a[f],f,d),null!=e&&i.push(e);return S.apply([],i)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),_.isFunction(a)?(d=R.call(arguments,2),e=function(){return a.apply(b||t
his,d.concat(R.call(arguments)))},e.guid=a.guid=a.guid||_.guid++,e):void 0},now:Date.now,support:Y}),_.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){V["[object "+b+"]"]=b.toLowerCase()});var eb=function(a){function b(a,b,c,d){var e,f,g,h,i,j,l,n,o,p;if((b?b.ownerDocument||b:O)!==G&&F(b),b=b||G,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(I&&!d){if(e=sb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&M(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return _.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&v.getElementsByClassName&&b.getElementsByClassName)return _.apply(c,b.getElementsByClassName(g)),c}if(v.qsa&&(!J||!J.test(a))){if(n=l=N,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(j=z(a),(l=b.getAttribute("id"))?n=l.replace(ub,"\\$&"):b.setAttribute("id",
n),n="[id='"+n+"'] ",i=j.length;i--;)j[i]=n+m(j[i]);o=tb.test(a)&&k(b.parentNode)||b,p=j.join(",")}if(p)try{return _.apply(c,o.querySelectorAll(p)),c}catch(q){}finally{l||b.removeAttribute("id")}}}return B(a.replace(ib,"$1"),b,c,d)}function c(){function a(c,d){return b.push(c+" ")>w.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[N]=!0,a}function e(a){var b=G.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=a.length;d--;)w.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return d(fu
nction(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function k(a){return a&&typeof a.getElementsByTagName!==V&&a}function l(){}function m(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function n(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=Q++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[P,f];if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e){if(i=b[N]||(b[N]={}),(h=i[d])&&h[0]===P&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function o(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,c,d){for(var e=0,f=c.length;f>e;e++)b(a,c[e],d);return d}function q(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function r(a,b,c,e,f,g){return e&&!e[N]&&(e=
r(e)),f&&!f[N]&&(f=r(f,g)),d(function(d,g,h,i){var j,k,l,m=[],n=[],o=g.length,r=d||p(b||"*",h.nodeType?[h]:h,[]),s=!a||!d&&b?r:q(r,m,a,h,i),t=c?f||(d?a:o||e)?[]:g:s;if(c&&c(s,t,h,i),e)for(j=q(t,n),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[n[k]]=!(s[n[k]]=l));if(d){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?bb.call(d,l):m[k])>-1&&(d[j]=!(g[j]=l))}}else t=q(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function s(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return bb.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==C)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=w.relative[a[h].type])k=[n(o(k),c)];else{if(c=w.filter[a[h].type].apply(null,a[h].matches),c[N]){for(d=++h;e>d&&!w.relative[a[d].type];d++);return r(h>1&&o(k),h>1&&m(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ib,"$1"),
c,d>h&&s(a.slice(h,d)),e>d&&s(a=a.slice(d)),e>d&&m(a))}k.push(c)}return o(k)}function t(a,c){var e=c.length>0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],r=[],s=C,t=d||f&&w.find.TAG("*",j),u=P+=null==s?1:Math.random()||.1,v=t.length;for(j&&(C=g!==G&&g);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0;m=a[l++];)if(m(k,g,h)){i.push(k);break}j&&(P=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,r,g,h);if(d){if(n>0)for(;o--;)p[o]||r[o]||(r[o]=Z.call(i));r=q(r)}_.apply(i,r),j&&!d&&r.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(P=u,C=s),p};return e?d(g):g}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P=0,Q=0,R=c(),S=c(),T=c(),U=function(a,b){return a===b&&(E=!0),0},V="undefined",W=1<<31,X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,ab=Y.slice,bb=Y.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},cb="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hid
den|ismap|loop|multiple|open|readonly|required|scoped",db="[\\x20\\t\\r\\n\\f]",eb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",fb=eb.replace("w","w#"),gb="\\["+db+"*("+eb+")(?:"+db+"*([*^$|!~]?=)"+db+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+fb+"))|)"+db+"*\\]",hb=":("+eb+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+gb+")*)|.*)\\)|)",ib=new RegExp("^"+db+"+|((?:^|[^\\\\])(?:\\\\.)*)"+db+"+$","g"),jb=new RegExp("^"+db+"*,"+db+"*"),kb=new RegExp("^"+db+"*([>+~]|"+db+")"+db+"*"),lb=new RegExp("="+db+"*([^\\]'\"]*?)"+db+"*\\]","g"),mb=new RegExp(hb),nb=new RegExp("^"+fb+"$"),ob={ID:new RegExp("^#("+eb+")"),CLASS:new RegExp("^\\.("+eb+")"),TAG:new RegExp("^("+eb.replace("w","w*")+")"),ATTR:new RegExp("^"+gb),PSEUDO:new RegExp("^"+hb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+db+"*(even|odd|(([+-]|)(\\d*)n|)"+db+"*(?:([+-]|)"+db+"*(\\d+)|))"+db+"*\\)|)","i"),bool:new RegExp("^(?:"+cb+")$","i"),needsContext:
new RegExp("^"+db+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+db+"*((?:-\\d)?\\d*)"+db+"*\\)|)(?=[^-]|$)","i")},pb=/^(?:input|select|textarea|button)$/i,qb=/^h\d$/i,rb=/^[^{]+\{\s*\[native \w/,sb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tb=/[+~]/,ub=/'|\\/g,vb=new RegExp("\\\\([\\da-f]{1,6}"+db+"?|("+db+")|.)","ig"),wb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{_.apply(Y=ab.call(O.childNodes),O.childNodes),Y[O.childNodes.length].nodeType}catch(xb){_={apply:Y.length?function(a,b){$.apply(a,ab.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}v=b.support={},y=b.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},F=b.setDocument=function(a){var b,c=a?a.ownerDocument||a:O,d=c.defaultView;return c!==G&&9===c.nodeType&&c.documentElement?(G=c,H=c.documentElement,I=!y(c),d&&d!==d.top&&(d.addEventListener?d.addEventListener("u
nload",function(){F()},!1):d.attachEvent&&d.attachEvent("onunload",function(){F()})),v.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),v.getElementsByTagName=e(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),v.getElementsByClassName=rb.test(c.getElementsByClassName)&&e(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),v.getById=e(function(a){return H.appendChild(a).id=N,!c.getElementsByName||!c.getElementsByName(N).length}),v.getById?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&I){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){return a.getAttribute("id")===b}}):(delete w.find.ID,w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b
}}),w.find.TAG=v.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.CLASS=v.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==V&&I?b.getElementsByClassName(a):void 0},K=[],J=[],(v.qsa=rb.test(c.querySelectorAll))&&(e(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&J.push("[*^$]="+db+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||J.push("\\["+db+"*(?:value|"+cb+")"),a.querySelectorAll(":checked").length||J.push(":checked")}),e(function(a){var b=c.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&J.push("name"+db+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||J.push(":enabled",
":disabled"),a.querySelectorAll("*,:x"),J.push(",.*:")})),(v.matchesSelector=rb.test(L=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&e(function(a){v.disconnectedMatch=L.call(a,"div"),L.call(a,"[s!='']:x"),K.push("!=",hb)}),J=J.length&&new RegExp(J.join("|")),K=K.length&&new RegExp(K.join("|")),b=rb.test(H.compareDocumentPosition),M=b||rb.test(H.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=b?function(a,b){if(a===b)return E=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!v.sortDetached&&b.compareDocumentPosition(a)===d?a===c||a.ownerDocument===O&&M(O,a)?-1:b===c||b.ownerDocument===O&&M(O,b)?1
:D?bb.call(D,a)-bb.call(D,b):0:4&d?-1:1)}:function(a,b){if(a===b)return E=!0,0;var d,e=0,f=a.parentNode,h=b.parentNode,i=[a],j=[b];if(!f||!h)return a===c?-1:b===c?1:f?-1:h?1:D?bb.call(D,a)-bb.call(D,b):0;if(f===h)return g(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?g(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},c):G},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if((a.ownerDocument||a)!==G&&F(a),c=c.replace(lb,"='$1']"),!(!v.matchesSelector||!I||K&&K.test(c)||J&&J.test(c)))try{var d=L.call(a,c);if(d||v.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return b(c,G,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!==G&&F(a),M(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!==G&&F(a);var c=w.attrHandle[b.toLowerCase()],d=c&&X.call(w.attrHandle,b.toLowerCase())?c(a,b,!I):void 0;return void 0!==d?d:v.attributes||!I?a.getAttribute(b):(d=a.getAttribut
eNode(b))&&d.specified?d.value:null},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(E=!v.detectDuplicates,D=!v.sortStable&&a.slice(0),a.sort(U),E){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return D=null,a},x=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=x(b);return c},w=b.selectors={cacheLength:50,createPseudo:d,match:ob,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(vb,wb),a[3]=(a[3]||a[4]||a[5]||"").replace(vb,wb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice
(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return ob.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&mb.test(c)&&(b=z(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(vb,wb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=R[a+" "];return b||(b=new RegExp("(^|"+db+")"+a+"("+db+"|$)"))&&R(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:c?(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f+" ").indexOf(d)>-1:"|="===
c?f===d||f.slice(0,d.length+1)===d+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===P&&j[1],m=j[0]===P&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[P,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===P)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[P,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,c){var e,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||b.error("unsuppo
rted pseudo: "+a);return f[N]?f(c):f.length>1?(e=[a,a,"",c],w.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=bb.call(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=A(a.replace(ib,"$1"));return e[N]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:d(function(a){return nb.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(vb,wb).toLowerCase(),function(b){var c;do if(c=I?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},r
oot:function(a){return a===H},focus:function(a){return a===G.activeElement&&(!G.hasFocus||G.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return qb.test(a.nodeName)},input:function(a){return pb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:j(function(){return[0]}),last:j(function(a,b){return[b-1]}),eq:j(function(a,b,c){return[0>c?
c+b:c]}),even:j(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:j(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:j(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:j(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},w.pseudos.nth=w.pseudos.eq;for(u in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[u]=h(u);for(u in{submit:!0,reset:!0})w.pseudos[u]=i(u);return l.prototype=w.filters=w.pseudos,w.setFilters=new l,z=b.tokenize=function(a,c){var d,e,f,g,h,i,j,k=S[a+" "];if(k)return c?0:k.slice(0);for(h=a,i=[],j=w.preFilter;h;){(!d||(e=jb.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),d=!1,(e=kb.exec(h))&&(d=e.shift(),f.push({value:d,type:e[0].replace(ib," ")}),h=h.slice(d.length));for(g in w.filter)!(e=ob[g].exec(h))||j[g]&&!(e=j[g](e))||(d=e.shift(),f.push({value:d,type:g,matches:e}),h=h.slice(d.length));if(!d)break}return c?h.length:h?b.error(a):S(a,i).slice(0)},A=b.compile=function(a,b){var c,d=[],e=[],f=
T[a+" "];if(!f){for(b||(b=z(a)),c=b.length;c--;)f=s(b[c]),f[N]?d.push(f):e.push(f);f=T(a,t(e,d)),f.selector=a}return f},B=b.select=function(a,b,c,d){var e,f,g,h,i,j="function"==typeof a&&a,l=!d&&z(a=j.selector||a);if(c=c||[],1===l.length){if(f=l[0]=l[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&v.getById&&9===b.nodeType&&I&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(vb,wb),b)||[])[0],!b)return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=ob.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(vb,wb),tb.test(f[0].type)&&k(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return _.apply(c,d),c;break}}return(j||A(a,l))(d,b,!I,c,tb.test(a)&&k(b.parentNode)||b),c},v.sortStable=N.split("").sort(U).join("")===N,v.detectDuplicates=!!E,F(),v.sortDetached=e(function(a){return 1&a.compareDocumentPosition(G.createElement("div"))}),e(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firs
tChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),v.attributes&&e(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(cb,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);_.find=eb,_.expr=eb.selectors,_.expr[":"]=_.expr.pseudos,_.unique=eb.uniqueSort,_.text=eb.getText,_.isXMLDoc=eb.isXML,_.contains=eb.contains;var fb=_.expr.match.needsContext,gb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,hb=/^.[^:#\[\.,]*$/;_.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?_.find.matchesSelector(d,a)?[d]:[]:_.find.matches(a,_.grep(b,function(a){return 1===a.nodeType}))},_.fn.extend({find:fu
nction(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(_(a).filter(function(){for(b=0;c>b;b++)if(_.contains(e[b],this))return!0
+}));for(b=0;c>b;b++)_.find(a,e[b],d);return d=this.pushStack(c>1?_.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(d(this,a||[],!1))},not:function(a){return this.pushStack(d(this,a||[],!0))},is:function(a){return!!d(this,"string"==typeof a&&fb.test(a)?_(a):a||[],!1).length}});var ib,jb=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,kb=_.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:jb.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||ib).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof _?b[0]:b,_.merge(this,_.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:Z,!0)),gb.test(c[1])&&_.isPlainObject(b))for(c in b)_.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=Z.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=Z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this)
:_.isFunction(a)?"undefined"!=typeof ib.ready?ib.ready(a):a(_):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),_.makeArray(a,this))};kb.prototype=_.fn,ib=_(Z);var lb=/^(?:parents|prev(?:Until|All))/,mb={children:!0,contents:!0,next:!0,prev:!0};_.extend({dir:function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&_(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),_.fn.extend({has:function(a){var b=_(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(_.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=fb.test(a)||"string"!=typeof a?_(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&_.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?_.unique(f):f)},index:function(a){return a?"string"==type
of a?U.call(_(a),this[0]):U.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(_.unique(_.merge(this.get(),_(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),_.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return _.dir(a,"parentNode")},parentsUntil:function(a,b,c){return _.dir(a,"parentNode",c)},next:function(a){return e(a,"nextSibling")},prev:function(a){return e(a,"previousSibling")},nextAll:function(a){return _.dir(a,"nextSibling")},prevAll:function(a){return _.dir(a,"previousSibling")},nextUntil:function(a,b,c){return _.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return _.dir(a,"previousSibling",c)},siblings:function(a){return _.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return _.sibling(a.firstChild)},contents:function(a){return a.contentDocument||_.merge([],a.childNodes)}},f
unction(a,b){_.fn[a]=function(c,d){var e=_.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=_.filter(d,e)),this.length>1&&(mb[a]||_.unique(e),lb.test(a)&&e.reverse()),this.pushStack(e)}});var nb=/\S+/g,ob={};_.Callbacks=function(a){a="string"==typeof a?ob[a]||f(a):_.extend({},a);var b,c,d,e,g,h,i=[],j=!a.once&&[],k=function(f){for(b=a.memory&&f,c=!0,h=e||0,e=0,g=i.length,d=!0;i&&g>h;h++)if(i[h].apply(f[0],f[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,i&&(j?j.length&&k(j.shift()):b?i=[]:l.disable())},l={add:function(){if(i){var c=i.length;!function f(b){_.each(b,function(b,c){var d=_.type(c);"function"===d?a.unique&&l.has(c)||i.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),d?g=i.length:b&&(e=c,k(b))}return this},remove:function(){return i&&_.each(arguments,function(a,b){for(var c;(c=_.inArray(b,i,c))>-1;)i.splice(c,1),d&&(g>=c&&g--,h>=c&&h--)}),this},has:function(a){return a?_.inArray(a,i)>-1:!(!i||!i.length)},empty:function(){return i=[],g=0,this},disa
ble:function(){return i=j=b=void 0,this},disabled:function(){return!i},lock:function(){return j=void 0,b||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return!i||c&&!j||(b=b||[],b=[a,b.slice?b.slice():b],d?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!c}};return l},_.extend({Deferred:function(a){var b=[["resolve","done",_.Callbacks("once memory"),"resolved"],["reject","fail",_.Callbacks("once memory"),"rejected"],["notify","progress",_.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return _.Deferred(function(c){_.each(b,function(b,f){var g=_.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&_.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:f
unction(a){return null!=a?_.extend(a,d):d}},e={};return d.pipe=d.then,_.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b,c,d,e=0,f=R.call(arguments),g=f.length,h=1!==g||a&&_.isFunction(a.promise)?g:0,i=1===h?a:_.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?R.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);g>e;e++)f[e]&&_.isFunction(f[e].promise)?f[e].promise().done(j(e,d,f)).fail(i.reject).progress(j(e,c,b)):--h;return h||i.resolveWith(d,f),i.promise()}});var pb;_.fn.ready=function(a){return _.ready.promise().done(a),this},_.extend({isReady:!1,readyWait:1,holdReady:function(a){a?_.readyWait++:_.ready(!0)},ready:function(a){(a===!0?--_.readyWait:_.isReady)||(_
.isReady=!0,a!==!0&&--_.readyWait>0||(pb.resolveWith(Z,[_]),_.fn.triggerHandler&&(_(Z).triggerHandler("ready"),_(Z).off("ready"))))}}),_.ready.promise=function(b){return pb||(pb=_.Deferred(),"complete"===Z.readyState?setTimeout(_.ready):(Z.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1))),pb.promise(b)},_.ready.promise();var qb=_.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===_.type(c)){e=!0;for(h in c)_.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,_.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(_(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};_.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType},h.uid=1,h.accepts=_.acceptData,h.prototype={key:function(a){if(!h.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=h.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=
c,_.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(_.isEmptyObject(f))_.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,_.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{_.isArray(b)?d=b.concat(b.map(_.camelCase)):(e=_.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(nb)||[])),c=d.length;for(;c--;)delete g[d[c]]}},hasData:function(a){return!_.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var rb=new h,sb=new h,tb=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ub=/([A-Z])/g;_.extend({hasData:function(a){return sb.hasD
ata(a)||rb.hasData(a)},data:function(a,b,c){return sb.access(a,b,c)},removeData:function(a,b){sb.remove(a,b)},_data:function(a,b,c){return rb.access(a,b,c)},_removeData:function(a,b){rb.remove(a,b)}}),_.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=sb.get(f),1===f.nodeType&&!rb.get(f,"hasDataAttrs"))){for(c=g.length;c--;)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=_.camelCase(d.slice(5)),i(f,d,e[d])));rb.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){sb.set(this,a)}):qb(this,function(b){var c,d=_.camelCase(a);if(f&&void 0===b){if(c=sb.get(f,a),void 0!==c)return c;if(c=sb.get(f,d),void 0!==c)return c;if(c=i(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=sb.get(this,d);sb.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&sb.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){sb.remove(this,a)})}}),_.extend({queue:function(a,b,c){v
ar d;return a?(b=(b||"fx")+"queue",d=rb.get(a,b),c&&(!d||_.isArray(c)?d=rb.access(a,b,_.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=_.queue(a,b),d=c.length,e=c.shift(),f=_._queueHooks(a,b),g=function(){_.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return rb.get(a,c)||rb.access(a,c,{empty:_.Callbacks("once memory").add(function(){rb.remove(a,[b+"queue",c])})})}}),_.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?_.queue(this[0],a):void 0===b?this:this.each(function(){var c=_.queue(this,a,b);_._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&_.dequeue(this,a)})},dequeue:function(a){return this.each(function(){_.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=_.Deferred(),f=this,g=this.length,h=funct
ion(){--d||e.resolveWith(f,[f])};for("string"!=typeof a&&(b=a,a=void 0),a=a||"fx";g--;)c=rb.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var vb=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,wb=["Top","Right","Bottom","Left"],xb=function(a,b){return a=b||a,"none"===_.css(a,"display")||!_.contains(a.ownerDocument,a)},yb=/^(?:checkbox|radio)$/i;!function(){var a=Z.createDocumentFragment(),b=a.appendChild(Z.createElement("div")),c=Z.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),Y.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",Y.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var zb="undefined";Y.focusinBubbles="onfocusin"in a;var Ab=/^key/,Bb=/^(?:mouse|pointer|contextmenu)|click/,Cb=/^(?:focusinfocus|focusoutblur)$/,Db=/^([^.]*)(?:\.(.+)|)$/;_.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,
m,n,o,p,q=rb.get(a);if(q)for(c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=_.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return typeof _!==zb&&_.event.triggered!==b.type?_.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(nb)||[""],j=b.length;j--;)h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=_.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=_.event.special[n]||{},k=_.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&_.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),_.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=rb.hasData(a)&&rb.get(a);if(q&&(i=q.events)){for(b=(b||"").match(nb)||[""],j=b.length;j--;
)if(h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=_.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||_.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)_.event.remove(a,n+b[j],c,d,!0);_.isEmptyObject(i)&&(delete q.handle,rb.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m=[d||Z],n=X.call(b,"type")?b.type:b,o=X.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||Z,3!==d.nodeType&&8!==d.nodeType&&!Cb.test(n+_.event.triggered)&&(n.indexOf(".")>=0&&(o=n.split("."),n=o.shift(),o.sort()),j=n.indexOf(":")<0&&"on"+n,b=b[_.expando]?b:new _.Event(n,"object"==typeof b&&b),b.isTrigger=e?2:3,b.n
amespace=o.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:_.makeArray(c,[b]),l=_.event.special[n]||{},e||!l.trigger||l.trigger.apply(d,c)!==!1)){if(!e&&!l.noBubble&&!_.isWindow(d)){for(i=l.delegateType||n,Cb.test(i+n)||(g=g.parentNode);g;g=g.parentNode)m.push(g),h=g;h===(d.ownerDocument||Z)&&m.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=m[f++])&&!b.isPropagationStopped();)b.type=f>1?i:l.bindType||n,k=(rb.get(g,"events")||{})[b.type]&&rb.get(g,"handle"),k&&k.apply(g,c),k=j&&g[j],k&&k.apply&&_.acceptData(g)&&(b.result=k.apply(g,c),b.result===!1&&b.preventDefault());return b.type=n,e||b.isDefaultPrevented()||l._default&&l._default.apply(m.pop(),c)!==!1||!_.acceptData(d)||j&&_.isFunction(d[n])&&!_.isWindow(d)&&(h=d[j],h&&(d[j]=null),_.event.triggered=n,d[n](),_.event.triggered=void 0,h&&(d[j]=h)),b.result}},dispatch:function(a){a=_.event.fix(a);var b,c,d,e,f,g=[],h=R.call(argume
nts),i=(rb.get(this,"events")||{})[a.type]||[],j=_.event.special[a.type]||{};if(h[0]=a,a.delegateTarget=this,!j.preDispatch||j.preDispatch.call(this,a)!==!1){for(g=_.event.handlers.call(this,a,i),b=0;(e=g[b++])&&!a.isPropagationStopped();)for(a.currentTarget=e.elem,c=0;(f=e.handlers[c++])&&!a.isImmediatePropagationStopped();)(!a.namespace_re||a.namespace_re.test(f.namespace))&&(a.handleObj=f,a.data=f.data,d=((_.event.special[f.origType]||{}).handle||f.handler).apply(e.elem,h),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return j.postDispatch&&j.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?_(e,this).index(i)>=0:_.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}re
turn h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||Z,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[_.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];for(g||(this.fixHooks[e]=g=Bb.test(e)?this.mouseHooks:Ab.tes
t(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new _.Event(f),b=d.length;b--;)c=d[b],a[c]=f[c];return a.target||(a.target=Z),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==l()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===l()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&_.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return _.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=_.extend(new _.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?_.event.trigger(e,null,b):_.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},_.removeEvent=function(a,b,c){a.removeE
ventListener&&a.removeEventListener(b,c,!1)},_.Event=function(a,b){return this instanceof _.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?j:k):this.type=a,b&&_.extend(this,b),this.timeStamp=a&&a.timeStamp||_.now(),void(this[_.expando]=!0)):new _.Event(a,b)},_.Event.prototype={isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=j,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=j,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=j,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},_.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,
b){_.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!_.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),Y.focusinBubbles||_.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){_.event.simulate(b,a.target,_.event.fix(a),!0)};_.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=rb.access(d,b);e||d.addEventListener(a,c,!0),rb.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=rb.access(d,b)-1;e?rb.access(d,b,e):(d.removeEventListener(a,c,!0),rb.remove(d,b))}}}),_.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=k;else if(!d)return this;return 1===e&&(f=d,d=function(a){return _().off(a),f.apply(this,arguments)
},d.guid=f.guid||(f.guid=_.guid++)),this.each(function(){_.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,_(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=k),this.each(function(){_.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){_.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?_.event.trigger(a,b,c,!0):void 0}});var Eb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Fb=/<([\w:]+)/,Gb=/<|&#?\w+;/,Hb=/<(?:script|style|link)/i,Ib=/checked\s*(?:[^=]|=\s*.checked.)/i,Jb=/^$|\/(?:java|ecma)script/i,Kb=/^true\/(.*)/,Lb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Mb={option:[1,"<select multiple='multiple'>","</selec
t>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Mb.optgroup=Mb.option,Mb.tbody=Mb.tfoot=Mb.colgroup=Mb.caption=Mb.thead,Mb.th=Mb.td,_.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=_.contains(a.ownerDocument,a);if(!(Y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||_.isXMLDoc(a)))for(g=r(h),f=r(a),d=0,e=f.length;e>d;d++)s(f[d],g[d]);if(b)if(c)for(f=f||r(a),g=g||r(h),d=0,e=f.length;e>d;d++)q(f[d],g[d]);else q(a,h);return g=r(h,"script"),g.length>0&&p(g,!i&&r(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===_.type(e))_.merge(l,e.nodeType?[e]:e);else if(Gb.test(e)){for(f=f||k.appendChild(b.createElement("div")),g=(Fb.exec(e)||["",""])[1].toLowerCase(),h=Mb[g]||Mb._default,f.innerHTML=h[1]+e.replace(Eb,"<$1></$2>"
)+h[2],j=h[0];j--;)f=f.lastChild;_.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));for(k.textContent="",m=0;e=l[m++];)if((!d||-1===_.inArray(e,d))&&(i=_.contains(e.ownerDocument,e),f=r(k.appendChild(e),"script"),i&&p(f),c))for(j=0;e=f[j++];)Jb.test(e.type||"")&&c.push(e);return k},cleanData:function(a){for(var b,c,d,e,f=_.event.special,g=0;void 0!==(c=a[g]);g++){if(_.acceptData(c)&&(e=c[rb.expando],e&&(b=rb.cache[e]))){if(b.events)for(d in b.events)f[d]?_.event.remove(c,d):_.removeEvent(c,d,b.handle);rb.cache[e]&&delete rb.cache[e]}delete sb.cache[c[sb.expando]]}}}),_.fn.extend({text:function(a){return qb(this,function(a){return void 0===a?_.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.appendChild(a)}})}
,prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?_.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||_.cleanData(r(c)),c.parentNode&&(b&&_.contains(c.ownerDocument,c)&&p(r(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(_.cleanData(r(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return _.clone(this,a,b)})},html:function(a){return qb(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.inner
HTML;if("string"==typeof a&&!Hb.test(a)&&!Mb[(Fb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Eb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(_.cleanData(r(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,_.cleanData(r(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=S.apply([],a);var c,d,e,f,g,h,i=0,j=this.length,k=this,l=j-1,m=a[0],p=_.isFunction(m);if(p||j>1&&"string"==typeof m&&!Y.checkClone&&Ib.test(m))return this.each(function(c){var d=k.eq(c);p&&(a[0]=m.call(this,c,d.html())),d.domManip(a,b)});if(j&&(c=_.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(e=_.map(r(c,"script"),n),f=e.length;j>i;i++)g=c,i!==l&&(g=_.clone(g,!0,!0),f&&_.merge(e,r(g,"script"))),b.call(th
is[i],g,i);if(f)for(h=e[e.length-1].ownerDocument,_.map(e,o),i=0;f>i;i++)g=e[i],Jb.test(g.type||"")&&!rb.access(g,"globalEval")&&_.contains(h,g)&&(g.src?_._evalUrl&&_._evalUrl(g.src):_.globalEval(g.textContent.replace(Lb,"")))}return this}}),_.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){_.fn[a]=function(a){for(var c,d=[],e=_(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),_(e[g])[b](c),T.apply(d,c.get());return this.pushStack(d)}});var Nb,Ob={},Pb=/^margin/,Qb=new RegExp("^("+vb+")(?!px)[a-z%]+$","i"),Rb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};!function(){function b(){g.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",g.innerHTML="",e.appendChild(f);var b=a.getComputedStyle(g,null);c="1%"!==b.top,d="4px"===b.width,e.removeChild(f)}
var c,d,e=Z.documentElement,f=Z.createElement("div"),g=Z.createElement("div");g.style&&(g.style.backgroundClip="content-box",g.cloneNode(!0).style.backgroundClip="",Y.clearCloneStyle="content-box"===g.style.backgroundClip,f.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",f.appendChild(g),a.getComputedStyle&&_.extend(Y,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return null==d&&b(),d},reliableMarginRight:function(){var b,c=g.appendChild(Z.createElement("div"));return c.style.cssText=g.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",g.style.width="1px",e.appendChild(f),b=!parseFloat(a.getComputedStyle(c,null).marginRight),e.removeChild(f),b}}))}(),_.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var S
b=/^(none|table(?!-c[ea]).+)/,Tb=new RegExp("^("+vb+")(.*)$","i"),Ub=new RegExp("^([+-])=("+vb+")","i"),Vb={position:"absolute",visibility:"hidden",display:"block"},Wb={letterSpacing:"0",fontWeight:"400"},Xb=["Webkit","O","Moz","ms"];_.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=v(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=_.camelCase(b),i=a.style;return b=_.cssProps[h]||(_.cssProps[h]=x(i,h)),g=_.cssHooks[b]||_.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ub.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(_.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||_.cssNumber[h]||(c+="px"),Y.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g
&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=_.camelCase(b);return b=_.cssProps[h]||(_.cssProps[h]=x(a.style,h)),g=_.cssHooks[b]||_.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=v(a,b,d)),"normal"===e&&b in Wb&&(e=Wb[b]),""===c||c?(f=parseFloat(e),c===!0||_.isNumeric(f)?f||0:e):e}}),_.each(["height","width"],function(a,b){_.cssHooks[b]={get:function(a,c,d){return c?Sb.test(_.css(a,"display"))&&0===a.offsetWidth?_.swap(a,Vb,function(){return A(a,b,d)}):A(a,b,d):void 0},set:function(a,c,d){var e=d&&Rb(a);return y(a,c,d?z(a,b,d,"border-box"===_.css(a,"boxSizing",!1,e),e):0)}}}),_.cssHooks.marginRight=w(Y.reliableMarginRight,function(a,b){return b?_.swap(a,{display:"inline-block"},v,[a,"marginRight"]):void 0}),_.each({margin:"",padding:"",border:"Width"},function(a,b){_.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+wb[d]+b]=f[d]||f[d-2]||f[0];return e}},Pb.test(a)||(_.cssHooks[a+b].
set=y)}),_.fn.extend({css:function(a,b){return qb(this,function(a,b,c){var d,e,f={},g=0;if(_.isArray(b)){for(d=Rb(a),e=b.length;e>g;g++)f[b[g]]=_.css(a,b[g],!1,d);return f}return void 0!==c?_.style(a,b,c):_.css(a,b)},a,b,arguments.length>1)},show:function(){return B(this,!0)},hide:function(){return B(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){xb(this)?_(this).show():_(this).hide()})}}),_.Tween=C,C.prototype={constructor:C,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(_.cssNumber[c]?"":"px")},cur:function(){var a=C.propHooks[this.prop];return a&&a.get?a.get(this):C.propHooks._default.get(this)},run:function(a){var b,c=C.propHooks[this.prop];return this.pos=b=this.options.duration?_.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.s
tep.call(this.elem,this.now,this),c&&c.set?c.set(this):C.propHooks._default.set(this),this}},C.prototype.init.prototype=C.prototype,C.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=_.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){_.fx.step[a.prop]?_.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[_.cssProps[a.prop]]||_.cssHooks[a.prop])?_.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},C.propHooks.scrollTop=C.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},_.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},_.fx=C.prototype.init,_.fx.step={};var Yb,Zb,$b=/^(?:toggle|show|hide)$/,_b=new RegExp("^(?:([+-])=|)("+vb+")([a-z%]*)$","i"),ac=/queueHooks$/,bc=[G],cc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=_b.exec(b),f=e&&e[3]||(_.cssNumber[a]?"":"px"),g=(_.cssNumber[a]||"px"!=
=f&&+d)&&_b.exec(_.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,_.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};_.Animation=_.extend(I,{tweener:function(a,b){_.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],cc[c]=cc[c]||[],cc[c].unshift(b)},prefilter:function(a,b){b?bc.unshift(a):bc.push(a)}}),_.speed=function(a,b,c){var d=a&&"object"==typeof a?_.extend({},a):{complete:c||!c&&b||_.isFunction(a)&&a,duration:a,easing:c&&b||b&&!_.isFunction(b)&&b};return d.duration=_.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in _.fx.speeds?_.fx.speeds[d.duration]:_.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){_.isFunction(d.old)&&d.old.call(this),d.queue&&_.dequeue(this,d.queue)},d},_.fn.extend({fadeTo:function(a,b,c,d){return this.filter(xb).css("opacity",0).show()
.end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=_.isEmptyObject(a),f=_.speed(b,c,d),g=function(){var b=I(this,_.extend({},a),f);(e||rb.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=_.timers,g=rb.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ac.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&_.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=rb.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=_.timers,g=d?d.length:0;for(c.finish=!0,_.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.spli
ce(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),_.each(["toggle","show","hide"],function(a,b){var c=_.fn[b];
+_.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(E(b,!0),a,d,e)}}),_.each({slideDown:E("show"),slideUp:E("hide"),slideToggle:E("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){_.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),_.timers=[],_.fx.tick=function(){var a,b=0,c=_.timers;for(Yb=_.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||_.fx.stop(),Yb=void 0},_.fx.timer=function(a){_.timers.push(a),a()?_.fx.start():_.timers.pop()},_.fx.interval=13,_.fx.start=function(){Zb||(Zb=setInterval(_.fx.tick,_.fx.interval))},_.fx.stop=function(){clearInterval(Zb),Zb=null},_.fx.speeds={slow:600,fast:200,_default:400},_.fn.delay=function(a,b){return a=_.fx?_.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=Z.createElement("input"),b=Z.createElement("select"),c=b.appendChild(Z.createEleme
nt("option"));a.type="checkbox",Y.checkOn=""!==a.value,Y.optSelected=c.selected,b.disabled=!0,Y.optDisabled=!c.disabled,a=Z.createElement("input"),a.value="t",a.type="radio",Y.radioValue="t"===a.value}();var dc,ec,fc=_.expr.attrHandle;_.fn.extend({attr:function(a,b){return qb(this,_.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){_.removeAttr(this,a)})}}),_.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===zb?_.prop(a,b,c):(1===f&&_.isXMLDoc(a)||(b=b.toLowerCase(),d=_.attrHooks[b]||(_.expr.match.bool.test(b)?ec:dc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=_.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void _.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(nb);if(f&&1===a.nodeType)for(;c=f[e++];)d=_.propFix[c]||c,_.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:functio
n(a,b){if(!Y.radioValue&&"radio"===b&&_.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),ec={set:function(a,b,c){return b===!1?_.removeAttr(a,c):a.setAttribute(c,c),c}},_.each(_.expr.match.bool.source.match(/\w+/g),function(a,b){var c=fc[b]||_.find.attr;fc[b]=function(a,b,d){var e,f;return d||(f=fc[b],fc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,fc[b]=f),e}});var gc=/^(?:input|select|textarea|button)$/i;_.fn.extend({prop:function(a,b){return qb(this,_.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[_.propFix[a]||a]})}}),_.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!_.isXMLDoc(a),f&&(b=_.propFix[b]||b,e=_.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||gc.test(a.n
odeName)||a.href?a.tabIndex:-1}}}}),Y.optSelected||(_.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),_.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){_.propFix[this.toLowerCase()]=this});var hc=/[\t\r\n\f]/g;_.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):" ")){for(f=0;e=b[f++];)d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=_.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).removeClass(a.call(this,b,this.classNa
me))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):"")){for(f=0;e=b[f++];)for(;d.indexOf(" "+e+" ")>=0;)d=d.replace(" "+e+" "," ");g=a?_.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(_.isFunction(a)?function(c){_(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c)for(var b,d=0,e=_(this),f=a.match(nb)||[];b=f[d++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else(c===zb||"boolean"===c)&&(this.className&&rb.set(this,"__className__",this.className),this.className=this.className||a===!1?"":rb.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(hc," ").indexOf(b)>=0)return!0;return!1}});var ic=/\r/g;_.fn.extend({val:function(a){var b
,c,d,e=this[0];{if(arguments.length)return d=_.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,_(this).val()):a,null==e?e="":"number"==typeof e?e+="":_.isArray(e)&&(e=_.map(e,function(a){return null==a?"":a+""})),b=_.valHooks[this.type]||_.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=_.valHooks[e.type]||_.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ic,""):null==c?"":c)}}}),_.extend({valHooks:{option:{get:function(a){var b=_.find.attr(a,"value");return null!=b?b:_.trim(_.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(Y.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&_.nodeName(c.parentNode,"optgroup"))){if(b=_(c).val(),f)return b;g.p
ush(b)}return g},set:function(a,b){for(var c,d,e=a.options,f=_.makeArray(b),g=e.length;g--;)d=e[g],(d.selected=_.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),_.each(["radio","checkbox"],function(){_.valHooks[this]={set:function(a,b){return _.isArray(b)?a.checked=_.inArray(_(a).val(),b)>=0:void 0}},Y.checkOn||(_.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),_.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){_.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),_.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){
return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var jc=_.now(),kc=/\?/;_.parseJSON=function(a){return JSON.parse(a+"")},_.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&_.error("Invalid XML: "+a),b};var lc,mc,nc=/#.*$/,oc=/([?&])_=[^&]*/,pc=/^(.*?):[ \t]*([^\r\n]*)$/gm,qc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rc=/^(?:GET|HEAD)$/,sc=/^\/\//,tc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,uc={},vc={},wc="*/".concat("*");try{mc=location.href}catch(xc){mc=Z.createElement("a"),mc.href="",mc=mc.href}lc=tc.exec(mc.toLowerCase())||[],_.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:mc,type:"GET",isLocal:qc.test(lc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":wc,text:"text/plain",html:"text/html",xml:"appli
cation/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":_.parseJSON,"text xml":_.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?L(L(a,_.ajaxSettings),b):L(_.ajaxSettings,a)},ajaxPrefilter:J(uc),ajaxTransport:J(vc),ajax:function(a,b){function c(a,b,c,g){var i,k,r,s,u,w=b;2!==t&&(t=2,h&&clearTimeout(h),d=void 0,f=g||"",v.readyState=a>0?4:0,i=a>=200&&300>a||304===a,c&&(s=M(l,v,c)),s=N(l,s,v,i),i?(l.ifModified&&(u=v.getResponseHeader("Last-Modified"),u&&(_.lastModified[e]=u),u=v.getResponseHeader("etag"),u&&(_.etag[e]=u)),204===a||"HEAD"===l.type?w="nocontent":304===a?w="notmodified":(w=s.state,k=s.data,r=s.error,i=!r)):(r=w,(a||!w)&&(w="error",0>a&&(a=0))),v.status=a,v.statusText=(b||w)+"",i?o.resolveWith(m,[k,w,v]):o.rejectWith(m,[v,w,r]),v.statusCode(q),q=void 0,j&&n.trigger(
i?"ajaxSuccess":"ajaxError",[v,l,i?k:r]),p.fireWith(m,[v,w]),j&&(n.trigger("ajaxComplete",[v,l]),--_.active||_.event.trigger("ajaxStop")))}"object"==typeof a&&(b=a,a=void 0),b=b||{};var d,e,f,g,h,i,j,k,l=_.ajaxSetup({},b),m=l.context||l,n=l.context&&(m.nodeType||m.jquery)?_(m):_.event,o=_.Deferred(),p=_.Callbacks("once memory"),q=l.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!g)for(g={};b=pc.exec(f);)g[b[1].toLowerCase()]=b[2];b=g[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return d&&d.abort(b),c(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,l.url=((a||l.url
||mc)+"").replace(nc,"").replace(sc,lc[1]+"//"),l.type=b.method||b.type||l.method||l.type,l.dataTypes=_.trim(l.dataType||"*").toLowerCase().match(nb)||[""],null==l.crossDomain&&(i=tc.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]===lc[1]&&i[2]===lc[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(lc[3]||("http:"===lc[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=_.param(l.data,l.traditional)),K(uc,l,b,v),2===t)return v;j=l.global,j&&0===_.active++&&_.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!rc.test(l.type),e=l.url,l.hasContent||(l.data&&(e=l.url+=(kc.test(e)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=oc.test(e)?e.replace(oc,"$1_="+jc++):e+(kc.test(e)?"&":"?")+"_="+jc++)),l.ifModified&&(_.lastModified[e]&&v.setRequestHeader("If-Modified-Since",_.lastModified[e]),_.etag[e]&&v.setRequestHeader("If-None-Match",_.etag[e])),(l.data&&l.hasContent&&l.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",l.contentTy
pe),v.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+wc+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)v.setRequestHeader(k,l.headers[k]);if(l.beforeSend&&(l.beforeSend.call(m,v,l)===!1||2===t))return v.abort();u="abort";for(k in{success:1,error:1,complete:1})v[k](l[k]);if(d=K(vc,l,b,v)){v.readyState=1,j&&n.trigger("ajaxSend",[v,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){v.abort("timeout")},l.timeout));try{t=1,d.send(r,c)}catch(w){if(!(2>t))throw w;c(-1,w)}}else c(-1,"No Transport");return v},getJSON:function(a,b,c){return _.get(a,b,c,"json")},getScript:function(a,b){return _.get(a,void 0,b,"script")}}),_.each(["get","post"],function(a,b){_[b]=function(a,c,d,e){return _.isFunction(c)&&(e=e||d,d=c,c=void 0),_.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){_.fn[b]=function(a){return this.on(b,a)}}),_
._evalUrl=function(a){return _.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},_.fn.extend({wrapAll:function(a){var b;return _.isFunction(a)?this.each(function(b){_(this).wrapAll(a.call(this,b))}):(this[0]&&(b=_(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(_.isFunction(a)?function(b){_(this).wrapInner(a.call(this,b))}:function(){var b=_(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=_.isFunction(a);return this.each(function(c){_(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){_.nodeName(this,"body")||_(this).replaceWith(this.childNodes)}).end()}}),_.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},_.expr.filters.visible=function(a){return!_.expr.filters.hidden(a)};var yc
=/%20/g,zc=/\[\]$/,Ac=/\r?\n/g,Bc=/^(?:submit|button|image|reset|file)$/i,Cc=/^(?:input|select|textarea|keygen)/i;_.param=function(a,b){var c,d=[],e=function(a,b){b=_.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=_.ajaxSettings&&_.ajaxSettings.traditional),_.isArray(a)||a.jquery&&!_.isPlainObject(a))_.each(a,function(){e(this.name,this.value)});else for(c in a)O(c,a[c],b,e);return d.join("&").replace(yc,"+")},_.fn.extend({serialize:function(){return _.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=_.prop(this,"elements");return a?_.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!_(this).is(":disabled")&&Cc.test(this.nodeName)&&!Bc.test(a)&&(this.checked||!yb.test(a))}).map(function(a,b){var c=_(this).val();return null==c?null:_.isArray(c)?_.map(c,function(a){return{name:b.name,value:a.replace(Ac,"\r\n")}}):{name:b.name,value:c.replace(Ac,"\r\n")}}).get()
}}),_.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Dc=0,Ec={},Fc={0:200,1223:204},Gc=_.ajaxSettings.xhr();a.ActiveXObject&&_(a).on("unload",function(){for(var a in Ec)Ec[a]()}),Y.cors=!!Gc&&"withCredentials"in Gc,Y.ajax=Gc=!!Gc,_.ajaxTransport(function(a){var b;return Y.cors||Gc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Dc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Ec[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Fc[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Ec[g]=b("abort");try{f.send(a.hasContent&&a
.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),_.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return _.globalEval(a),a}}}),_.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),_.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=_("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),Z.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Hc=[],Ic=/(=)\?(?=&|$)|\?\?/;_.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Hc.pop()||_.expando+"_"+jc++;return this[a]=!0,a}}),_.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ic.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("app
lication/x-www-form-urlencoded")&&Ic.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=_.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ic,"$1"+e):b.jsonp!==!1&&(b.url+=(kc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||_.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Hc.push(e)),g&&_.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),_.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||Z;var d=gb.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=_.buildFragment([a],b,e),e&&e.length&&_(e).remove(),_.merge([],d.childNodes))};var Jc=_.fn.load;_.fn.load=function(a,b,c){if("string"!=typeof a&&Jc)return Jc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=_.trim(a.slice(h)),a=a.slice(0,h)),_.isFunction(b)
?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&_.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?_("<div>").append(_.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},_.expr.filters.animated=function(a){return _.grep(_.timers,function(b){return a===b.elem}).length};var Kc=a.document.documentElement;_.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=_.css(a,"position"),l=_(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=_.css(a,"top"),i=_.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),_.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},_.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){_.offset.setOffset(this,a,b)});var b,c,d=t
his[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,_.contains(b,d)?(typeof d.getBoundingClientRect!==zb&&(e=d.getBoundingClientRect()),c=P(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===_.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),_.nodeName(a[0],"html")||(d=a.offset()),d.top+=_.css(a[0],"borderTopWidth",!0),d.left+=_.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-_.css(c,"marginTop",!0),left:b.left-d.left-_.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||Kc;a&&!_.nodeName(a,"html")&&"static"===_.css(a,"position");)a=a.offsetParent;return a||Kc})}}),_.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;_.fn[b]=function(e){return qb(this,function(b,e,f){var g=P(b);return void 0===f?g?g[c]:b[e]:void(
g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),_.each(["top","left"],function(a,b){_.cssHooks[b]=w(Y.pixelPosition,function(a,c){return c?(c=v(a,b),Qb.test(c)?_(a).position()[b]+"px":c):void 0})}),_.each({Height:"height",Width:"width"},function(a,b){_.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){_.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return qb(this,function(b,c,d){var e;return _.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?_.css(b,c,g):_.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),_.fn.size=function(){return this.length},_.fn.andSelf=_.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return _});var Lc=a.jQuery,Mc=a.$;return _.noConflict=function(b){return a.$===_&&(a.$=Mc),b&&a.jQuery
===_&&(a.jQuery=Lc),_},typeof b===zb&&(a.jQuery=a.$=_),_}),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.len
gth||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)
):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$elemen
t=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){
return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("ac
<TRUNCATED>
[45/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.svg
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.svg b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.svg
deleted file mode 100644
index a9f8469..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,504 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="fontawesomeregular" horiz-adv-x="1536" >
-<font-face units-per-em="1792" ascent="1536" descent="-256" />
-<missing-glyph horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="	" horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="¨" horiz-adv-x="1792" />
-<glyph unicode="©" horiz-adv-x="1792" />
-<glyph unicode="®" horiz-adv-x="1792" />
-<glyph unicode="´" horiz-adv-x="1792" />
-<glyph unicode="Æ" horiz-adv-x="1792" />
-<glyph unicode="Ø" horiz-adv-x="1792" />
-<glyph unicode=" " horiz-adv-x="768" />
-<glyph unicode=" " horiz-adv-x="1537" />
-<glyph unicode=" " horiz-adv-x="768" />
-<glyph unicode=" " horiz-adv-x="1537" />
-<glyph unicode=" " horiz-adv-x="512" />
-<glyph unicode=" " horiz-adv-x="384" />
-<glyph unicode=" " horiz-adv-x="256" />
-<glyph unicode=" " horiz-adv-x="256" />
-<glyph unicode=" " horiz-adv-x="192" />
-<glyph unicode=" " horiz-adv-x="307" />
-<glyph unicode=" " horiz-adv-x="85" />
-<glyph unicode=" " horiz-adv-x="307" />
-<glyph unicode=" " horiz-adv-x="384" />
-<glyph unicode="™" horiz-adv-x="1792" />
-<glyph unicode="∞" horiz-adv-x="1792" />
-<glyph unicode="≠" horiz-adv-x="1792" />
-<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="" horiz-adv-x="1792" d="M93 1350q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78z" />
-<glyph unicode="" d="M0 -64q0 50 34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5 q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5 t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768zM128 1120q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317 q54 43 100.5 115.5t46.5 131.5v11v13.5t-0.5 13t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z " />
-<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354 q-25 27 -25 48zM221 829l306 -297l-73 -421l378 199l377 -199l-72 421l306 297l-422 62l-189 382l-189 -382z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 131q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5 h-874q-121 0 -194 69.5t-73 189.5zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 -96v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 64v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 320q0 -26 19 -45t45 -19h128 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19 h-128q-26 0 -45 -19t-19 -45v-128zM512 -64q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM512 704q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM1536 64 v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM1536 320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19
-45v-128zM1536 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 128v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM0 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 128v384q0 52 38 90t90 38h512q52 0 90 -38 t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 608v192 q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1792" d="M121 608q0 40 28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68z" />
-<glyph unicode="" horiz-adv-x="1408" d="M110 214q0 40 28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-294 -294l294 -294q28 -28 28 -68t-28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294 q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" d="M0 640q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181 q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298zM640 768v640q0 52 38 90t90 38t90 -38t38 -90v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 -96v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM384 -96v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM768 -96v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576 q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 -96v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1536 -96v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23z" />
-<glyph unicode="" d="M0 531v222q0 12 8 23t19 13l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10 q129 -119 165 -170q7 -8 7 -22q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108 q-44 -23 -91 -38q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5z M512 640q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 1056v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23zM256 76q0 -22 7 -40.5 t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5v948h-896v-948zM384 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM640 224v576q0 14 9 23t23 9h64 q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM896 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23z" />
-<glyph unicode="" horiz-adv-x="1664" d="M26 636.5q1 13.5 11 21.5l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5zM256 64 v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22 v-376z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 544v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
-<glyph unicode="" horiz-adv-x="1920" d="M50 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256 q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73zM809 540q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 96v320q0 40 28 68t68 28h465l135 -136q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 985q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39q17 -41 -14 -70 l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70zM1152 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM418 620q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM416 672q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23z" />
-<glyph unicode="" d="M0 64v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552q25 -61 25 -123v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM197 576h316l95 -192h320l95 192h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8 t-2.5 -8z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 320v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55t-32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56z" />
-<glyph unicode="" d="M0 640q0 156 61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5 t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298z" />
-<glyph unicode="" d="M0 0v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129 q-19 -19 -45 -19t-45 19t-19 45zM18 800v7q65 268 270 434.5t480 166.5q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179 q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 160v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832z M256 288v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 544v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z M256 800v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 288v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z M512 544v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5zM512 800v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -
13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z " />
-<glyph unicode="" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192z" />
-<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110zM320 320v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19 q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 650q0 151 67 291t179 242.5t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32 q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32 q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314z" />
-<glyph unicode="" horiz-adv-x="768" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1152" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5zM1008 228q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5 q140 -59 225 -188.5t85 -282.5t-85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45zM1109 -7q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19 q13 0 26 -5q211 -91 338 -283.5t127 -422.5t-127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 0v640h640v-640h-640zM0 768v640h640v-640h-640zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM256 256v128h128v-128h-128zM256 1024v128h128v-128h-128zM768 0v640h384v-128h128v128h128v-384h-384v128h-128v-384h-128zM768 768v640h640v-640h-640z M896 896h384v384h-384v-384zM1024 0v128h128v-128h-128zM1024 1024v128h128v-128h-128zM1280 0v128h128v-128h-128z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 0v1408h63v-1408h-63zM94 1v1407h32v-1407h-32zM189 1v1407h31v-1407h-31zM346 1v1407h31v-1407h-31zM472 1v1407h62v-1407h-62zM629 1v1407h31v-1407h-31zM692 1v1407h31v-1407h-31zM755 1v1407h31v-1407h-31zM880 1v1407h63v-1407h-63zM1037 1v1407h63v-1407h-63z M1163 1v1407h63v-1407h-63zM1289 1v1407h63v-1407h-63zM1383 1v1407h63v-1407h-63zM1541 1v1407h94v-1407h-94zM1666 1v1407h32v-1407h-32zM1729 0v1408h63v-1408h-63z" />
-<glyph unicode="" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM704 1408h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M10 184q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23 t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57 q38 -15 59 -43q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5zM575 1056 q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
-<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 160v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-224 q-13 0 -22.5 9.5t-9.5 22.5zM384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1408 576q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 128v896q0 106 75 181t181 75h224l51 136q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181zM512 576q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM672 576q0 119 84.5 203.5t203.5 84.5t203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8 t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27 q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14zM555 527q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5 t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12zM533 1292q0 -50 4 -151t4 -152q0 -27 -0.5 -80 t-0.5 -79q0 -46 1 -69q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13zM538.5 165q0.5 -37 4.5 -83.5t12 -66.5q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25 t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5 q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9 t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44zM1414 109.5q9 18.5 42 18.5h80v1024 h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5z" />
-<glyph unicode="" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1 t-103 1t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29 t78 27q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44zM5 -64q0 28 26 49q4 3 36 30t59.5 49 t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5q12 0 42 -19.5t57.5 -41.5t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-5
7.5 -41.5t-42 -19.5q-13 0 -20.5 10.5 t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1536 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h896 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h1280 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 416v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5zM0 800v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192 q-13 0 -22.5 9.5t-9.5 22.5zM384 32v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 416v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 800v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 1184v192q0 13 9.5 22.5t22.5 9.5h1344q13 0
22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5 t-9.5 22.5zM32 704q0 14 9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088 q-13 0 -22.5 9.5t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 416v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23t-9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5z M0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5 t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5q39 -17 39 -59v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5 t-84.5 203.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v192l320 320l160 -160l512 512l416 -416v-448h-1408zM256 960q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" />
-<glyph unicode="" d="M0 -128v416l832 832l416 -416l-832 -832h-416zM128 128h128v-128h107l91 91l-235 235l-91 -91v-107zM298 384q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17zM896 1184l166 165q36 38 90 38q53 0 91 -38l235 -234 q37 -39 37 -91q0 -53 -37 -90l-166 -166z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 896q0 212 150 362t362 150t362 -150t150 -362q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179zM256 896q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73v1088q-148 0 -273 -73t-198 -198t-73 -273z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 512q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275q0 -212 -150 -362t-362 -150t-362 150t-150 362zM256 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29v-190 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM640 256v288l672 672l288 -288l-672 -672h-288zM736 448h96v-96h56l116 116l-152 152l-116 -116v-56zM944 688q16 -16 33 1l350 350q17 17 1 33t-33 -1l-350 -350q-17 -17 -1 -33zM1376 1280l92 92 q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68l-92 -92z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h255q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29v-259 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM256 704q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45l-384 -384 q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5t-38.5 114t-17.5 122z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3 q20 -8 20 -29v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM257 768q0 33 24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110q24 -24 24 -57t-24 -57l-814 -814q-24 -24 -57 -24t-57 24l-430 430 q-24 24 -24 57z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256 q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-710q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45 t-45 -19h-128q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M122 640q0 26 19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 -96v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31l-1328 -738q-23 -13 -39.5 -3t-16.5 36z" />
-<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM896 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32v710 q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
-<glyph unicode="" horiz-adv-x="1538" d="M1 64v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM1 525q-6 13 13 32l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13z" />
-<glyph unicode="" horiz-adv-x="1280" d="M154 704q0 26 19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1280" d="M90 128q0 26 19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19 t19 45v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19 t-19 -45v-128z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM387 414q0 -27 19 -46l90 -90q19 -19 46 -19q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19 l90 90q19 19 19 46q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 621q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45q0 28 -18 46l-91 90 q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM417 939q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26 t37.5 -59q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213zM640 160q0 -14 9 -23t23 -9 h192q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320 q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160zM640 1056q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160z" />
-<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143 q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45zM339 512q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5h-109q-26 0 -45 19 t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM429 480q0 13 10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23l-137 -137l137 -137q10 -10 10 -23t-10 -23l-146 -146q-10 -10 -23 -10t-23 10l-137 137 l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM346 640q0 26 19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45z" />
-<glyph unicode="" d="M0 643q0 157 61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5t-61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61t-245 164t-163.5 246t-61 300zM224 643q0 -162 89 -299l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199 t-73 -274zM471 185q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5q0 161 -87 295z" />
-<glyph unicode="" d="M64 576q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5t32.5 -90.5v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90 z" />
-<glyph unicode="" d="M0 512v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M53 565q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651q37 -39 37 -91q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75 q-38 38 -38 90z" />
-<glyph unicode="" horiz-adv-x="1664" d="M53 704q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 416q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45t-19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123 q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22t-13.5 30t-10.5 24q-127 285 -127 451z" />
-<glyph unicode="" d="M0 -64v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45zM781 800q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448 q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
-<glyph unicode="" d="M13 32q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23zM768 704v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10 t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M122.5 408.5q13.5 51.5 59.5 77.5l266 154l-266 154q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5 l-266 -154l266 -154q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 1126l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5l18 621q0 12 -10 18 q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18zM640 161q0 -13 10 -23t23 -10h192q13 0 22 9.5t9 23.5v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190z" />
-<glyph unicode="" d="M0 544v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68 t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23zM376 1120q0 -40 28 -68t68 -28h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68zM608 180q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5v56v468v192h-320v-192v-468v-56zM870 1024h194q40 0 68 28 t28 68t-28 68t-68 28q-43 0 -69 -31z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 121q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96 q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5zM384 448q0 -26 19 -45t45 -19q24 0 45 19 q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45t-19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 -160q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64zM256 640q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100 t113.5 -122.5t72.5 -150.5t27.5 -184q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 34 20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69t-20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69zM128 576q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5q-152 236 -381 353 q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 38 20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5q16 -10 16 -27q0 -7 -1 -9q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87 q-143 65 -263.5 173t-208.5 245q-20 31 -20 69zM128 576q167 -258 427 -375l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5zM896 0l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69t-20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95zM1056 286l280 502q8 -45 8 -84q0 -139 -79 -253.5t-209 -164.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M16 61l768 1408q17 31 47 49t65 18t65 -18t47 -49l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126zM752 992l17 -457q0 -10 10 -16.5t24 -6.5h185q14 0 23.5 6.5t10.5 16.5l18 459q0 12 -10 19q-13 11 -24 11h-220 q-11 0 -24 -11q-10 -7 -10 -21zM768 161q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 477q-1 13 9 25l96 97q9 9 23 9q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16 l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h288v288h-288v-288zM128 224 h288v320h-288v-320zM128 608h288v288h-288v-288zM384 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM480 -128h320v288h-320v-288zM480 224h320v320h-320v-320zM480 608h320v288h-320 v-288zM864 -128h320v288h-320v-288zM864 224h320v320h-320v-320zM864 608h320v288h-320v-288zM1152 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM1248 -128h288v288h-288v-288z M1248 224h288v320h-288v-320zM1248 608h288v288h-288v-288z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 160v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23zM0 1056v192q0 14 9 23t23 9h224q250 0 410 -225q-60 -92 -137 -273q-22 45 -37 72.5 t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23zM743 353q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 q-32 0 -85 -0.5t-81 -1t-73 1t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5 t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281z" />
-<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5 t-98.5 362zM0 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM1024 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M90 250.5q0 26.5 19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M90 773.5q0 26.5 19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 704q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45z M640 1120q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20z " />
-<glyph unicode="" horiz-adv-x="1664" d="M0 1216q0 26 19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024 q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45zM384 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1280 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5t-0.5 12.5zM73 56q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43 q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43z" />
-<glyph unicode="" horiz-adv-x="768" d="M64 64q0 26 19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v384h256v-384h-256zM640 128v896h256v-896h-256zM1024 128v640h256v-640h-256zM1408 128v1024h256v-1024h-256z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 286q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109 q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4q21 -63 74.5 -104 t121.5 -42q-116 -90 -261 -90q-26 0 -50 3z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544 q-119 0 -203.5 84.5t-84.5 203.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 0v1280q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM128 0h1536v128h-1536v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM256 1216h384v128h-384v-128zM512 574 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM640 574q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM736 576q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9 t9 23t-9 23t-23 9q-66 0 -113 -47t-47 -113z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 752q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41q0 -17 -49 -66t-66 -49 q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5zM192 768q0 -80 56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56 t56 136t-56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 549v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8 q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90 q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5zM384 640q0 -106 75 -181t181 -75 t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM1152 58v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0
-25 -51 -138q17 -23 30 -52q149 -15 149 -31 v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1152 1082v140q0 16 149 31q13 29 30 52 q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71 q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1408 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90zM1408 1152q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM616 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5 t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
-<glyph unicode="" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5 t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85 t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640z" />
-<glyph unicode="" d="M0 512v640q0 53 37.5 90.5t90.5 37.5h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186 q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5zM128 1088q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 512h32q16 0 35.5 -9 t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5 t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640z" />
-<glyph unicode="" horiz-adv-x="896" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z M128 940q0 -168 187 -355l581 -560l580 559q188 188 188 356q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5 t-21.5 -143z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5q0 -4 1 -20t0.5 -26.5t-3 -23.5 t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5zM384 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM223 1030q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86z M237 122h231v694h-231v-694zM595 122h231v388q0 38 7 56q15 35 45 59.5t74 24.5q116 0 116 -157v-371h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694z" />
-<glyph unicode="" horiz-adv-x="1152" d="M0 320q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19 t-19 45zM416 672q0 -14 9 -23t23 -9t23 9t9 23v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832 q-119 0 -203.5 84.5t-84.5 203.5zM685 576q0 13 10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
-<glyph unicode="" d="M0 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45zM894.5 78.5q0.5 10.5 3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113 t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5q0 4 -1 20t-0.5 26.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 928v128q0 40 28 68t68 28h288v96q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91t97.5 -37q75 0 133.5 -45.5 t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143zM128 928q0 -78 94.5 -162t235.5 -113q-74 162 -74 371 h-256v-96zM1206 653q141 29 235.5 113t94.5 162v96h-256q0 -209 -74 -371z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204 q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52 t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5h-224q-119 0 -203.5 84.5t-84.5 203.5zM271 315q3 5 13 2 q10 -5 7 -12q-5 -7 -13 -2q-10 5 -7 12zM304 290q6 6 16 -3q9 -11 2 -16q-6 -7 -16 3q-9 11 -2 16zM335 233q-9 13 0 18q9 7 17 -6q9 -12 0 -19q-8 -6 -17 7zM370 206q8 9 20 -3q12 -11 4 -19q-8 -9 -20 3q-13 11 -4 19zM419 168q4 11 19 7q
16 -5 13 -16q-4 -12 -19 -6 q-17 4 -13 15zM481 154q0 11 16 11q17 2 17 -11q0 -11 -16 -11q-17 -2 -17 11zM540 158q-2 12 14 15q16 2 18 -9q2 -10 -14 -14t-18 8z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -32v320q0 40 28 68t68 28h427q21 -56 70.5 -92t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 936q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69q-17 -40 -59 -40 h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40zM1152 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 433q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5q0 -165 -70 -327.5 t-196 -288t-281 -180.5q-124 -44 -326 -44q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5zM128 434q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5 q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24 q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 1069q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235 t235 -174q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5 t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832z" />
-<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62zM128 38l423 406l89 85l89 -85l423 -406 v1242h-1024v-1242z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 905q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5 q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5 t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M44 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5 q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145z" />
-<glyph unicode="" horiz-adv-x="1024" d="M95 631v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44 l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3 q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 96v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v608h-1664v-608zM128 1024h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600 q-13 0 -22.5 -9.5t-9.5 -22.5v-224zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 192q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 697v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5t259 -181.5q114 -113 181.5 -259t80.5 -306q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5 t-391.5 184.5q-25 2 -41.5 20t-16.5 43zM0 1201v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294q187 -186 294 -425.5t120 -501.5q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102 q-25 1 -42.5 19.5t-17.5 43.5z" />
-<glyph unicode="" d="M0 160v320q0 25 16 75l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM880 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1136 320q0 33 23.5 56.5t56.5 23.5 t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 672v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50 t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113zM768 633q377 -42 768 -341v954q-394 -302 -768 -343v-270z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
-<glyph unicode="" d="M2 435q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70l-53 -186l188 -48 q40 -10 52 -51q10 -42 -20 -70l-138 -135l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53 q-41 -12 -70 19q-31 29 -19 70l53 186l-188 48q-40 10 -52 51z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179q0 -105 -75.5 -181 t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q72 0 167 -32 t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139 q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106q-69 -57 -140 -57h-32v-640z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 769q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5v-640 q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181zM128 768q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119 q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5 t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5t-39 -89.5zM1536 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 640q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5t-90.5 -37.5h-640 q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5zM128 640q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140 v-32h640v32q0 72 32 167t64 193.5t32 179.5q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576q-20 0 -48.5 15t-55 33t-68 33t-84.5 15 q-67 0 -97.5 -44.5t-30.5 -115.5zM1152 -64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 640q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317q0 -142 -77.5 -230t-217.5 -87 l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5zM128 640q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33t55 33t48.5 15v-576q0 -50 38.5 -89 t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112 q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5zM1152 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM251 640q0 -27 18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM256 576q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18 l362 362l91 91q18 18 18 45t-18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 641q0 -27 18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19 t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45t-18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 639q0 -27 18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45t-18 45l-91 91 q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM226 979q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18 q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13 q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5 t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.
5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13 q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25 t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5 t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4 q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5q15 10 -7 16q-17 5 -43 -12q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.
5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8 q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5 q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26 q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5 q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -
4.5t-6 -4q-3 -4 0 -14t-2 -14 q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5 q-16 0 -22 -1q-146 -80 -235 -222zM877 26q0 -6 2 -16q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7 t-10 1.5t-11.5 -7q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M21 0q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5l-682 -682q-37 -37 -90 -37q-52 0
<TRUNCATED>
[50/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.ttf
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.ttf b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index 5cd6cff..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.ttf and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.woff
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.woff b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 9eaecb3..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.woff and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/gh-fork-ribbon.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/gh-fork-ribbon.css b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/gh-fork-ribbon.css
deleted file mode 100644
index 5806121..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/gh-fork-ribbon.css
+++ /dev/null
@@ -1,140 +0,0 @@
-/*!
- * "Fork me on GitHub" CSS ribbon v0.1.1 | MIT License
- * https://github.com/simonwhitaker/github-fork-ribbon-css
-*/
-
-/* Left will inherit from right (so we don't need to duplicate code) */
-.github-fork-ribbon {
- /* The right and left classes determine the side we attach our banner to */
- position: absolute;
-
- /* Add a bit of padding to give some substance outside the "stitching" */
- padding: 2px 0;
-
- /* Set the base colour */
- background-color: #a00;
-
- /* Set a gradient: transparent black at the top to almost-transparent black at the bottom */
- background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.15)));
- background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
- background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
- background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
- background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
- background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
-
- /* Add a drop shadow */
- -webkit-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5);
- -moz-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5);
- box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5);
-
- /* Set the font */
- font: 700 13px "Helvetica Neue", Helvetica, Arial, sans-serif;
-
- z-index: 9999;
- pointer-events: auto;
-}
-
-.github-fork-ribbon a,
-.github-fork-ribbon a:hover {
- /* Set the text properties */
- color: #fff;
- text-decoration: none;
- text-shadow: 0 -1px rgba(0, 0, 0, 0.5);
- text-align: center;
-
- /* Set the geometry. If you fiddle with these you'll also need
- to tweak the top and right values in .github-fork-ribbon. */
- width: 200px;
- line-height: 20px;
-
- /* Set the layout properties */
- display: inline-block;
- padding: 2px 0;
-
- /* Add "stitching" effect */
- border-width: 1px 0;
- border-style: dotted;
- border-color: #fff;
- border-color: rgba(255, 255, 255, 0.7);
-}
-
-.github-fork-ribbon-wrapper {
- width: 150px;
- height: 150px;
- position: absolute;
- overflow: hidden;
- top: 0;
- z-index: 9999;
- pointer-events: none;
-}
-
-.github-fork-ribbon-wrapper.fixed {
- position: fixed;
-}
-
-.github-fork-ribbon-wrapper.left {
- left: 0;
-}
-
-.github-fork-ribbon-wrapper.right {
- right: 0;
-}
-
-.github-fork-ribbon-wrapper.left-bottom {
- position: fixed;
- top: inherit;
- bottom: 0;
- left: 0;
-}
-
-.github-fork-ribbon-wrapper.right-bottom {
- position: fixed;
- top: inherit;
- bottom: 0;
- right: 0;
-}
-
-.github-fork-ribbon-wrapper.right .github-fork-ribbon {
- top: 42px;
- right: -43px;
-
- -webkit-transform: rotate(45deg);
- -moz-transform: rotate(45deg);
- -ms-transform: rotate(45deg);
- -o-transform: rotate(45deg);
- transform: rotate(45deg);
-}
-
-.github-fork-ribbon-wrapper.left .github-fork-ribbon {
- top: 42px;
- left: -43px;
-
- -webkit-transform: rotate(-45deg);
- -moz-transform: rotate(-45deg);
- -ms-transform: rotate(-45deg);
- -o-transform: rotate(-45deg);
- transform: rotate(-45deg);
-}
-
-
-.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon {
- top: 80px;
- left: -43px;
-
- -webkit-transform: rotate(45deg);
- -moz-transform: rotate(45deg);
- -ms-transform: rotate(45deg);
- -o-transform: rotate(45deg);
- transform: rotate(45deg);
-}
-
-.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon {
- top: 80px;
- right: -43px;
-
- -webkit-transform: rotate(-45deg);
- -moz-transform: rotate(-45deg);
- -ms-transform: rotate(-45deg);
- -o-transform: rotate(-45deg);
- transform: rotate(-45deg);
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/images/maze-black.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/images/maze-black.png b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/images/maze-black.png
deleted file mode 100644
index 99a49c2..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/images/maze-black.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif b/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif
deleted file mode 100644
index 75e3b1e..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy-white.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy-white.css b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy-white.css
deleted file mode 100644
index c48f614..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy-white.css
+++ /dev/null
@@ -1,698 +0,0 @@
-@-webkit-keyframes fadeIn {
- 0% {
- opacity: 0;
- }
-
- 25% {
- opacity: .3;
- }
-
- 50% {
- opacity: .66;
- }
-
- 75% {
- opacity: 1;
- }
-}
-
-@keyframes fadeIn {
- 0% {
- opacity: 0;
- }
-
- 25% {
- opacity: .3;
- }
-
- 50% {
- opacity: .66;
- }
-
- 75% {
- opacity: 1;
- }
-}
-
-@-webkit-keyframes pulse {
- 0% {
- text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
- }
-
- 25% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
- }
-
- 50% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
- }
-
- 75% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
- }
-}
-
-@keyframes pulse {
- 0% {
- text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
- }
-
- 25% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
- }
-
- 50% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
- }
-
- 75% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
- }
-}
-
-@-webkit-keyframes slide-in {
- 0% {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- }
-
- 100% {
- -webkit-transform: translate(0%, 0);
- transform: translate(0%, 0);
- }
-}
-
-@keyframes slide-in {
- 0% {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- }
-
- 100% {
- -webkit-transform: translate(0%, 0);
- transform: translate(0%, 0);
- }
-}
-
-@-webkit-keyframes slide-out {
- 0% {
- -webkit-transform: translate(0%, 0);
- transform: translate(0%, 0);
- }
-
- 100% {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- }
-}
-
-@keyframes slide-out {
- 100% {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- }
-}
-
-svg {
- background: white;
- position: absolute;
- left: 0;
- cursor: -webkit-grab;
- height: 100%;
- width: 100%;
- color: #333;
-}
-
-.edge path {
- fill: none;
-}
-
-.edge .edge-handler {
- stroke: transparent;
- fill: none;
-}
-
-.edge text {
- display: none;
- fill: white;
- font-weight: 200;
- text-anchor: middle;
- z-index: 1000;
- text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
-}
-
-.edge.active text {
- display: none;
- fill: white;
- font-weight: 200;
- text-anchor: middle;
- z-index: 1000;
- text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
-}
-
-.edge.active:hover,
-.edge.active.selected {
- cursor: pointer;
-}
-
-.edge.active:hover text,
-.edge.active.selected text {
- display: block;
-}
-
-#zoom-controls {
- background-color: rgba(0,0,0,0.3);
- border-top-right-radius: 3px;
- border-bottom-right-radius: 3px;
- box-shadow: 0 0 5px rgba(255,255,255,0.3);
- margin-top: 10%;
- z-index: 5;
- position: relative;
- display: block;
- width: 55px;
-}
-
-#zoom-controls #zoom-in,
-#zoom-controls #zoom-out,
-#zoom-controls #zoom-reset {
- padding: 12px;
- margin: 0;
- width: 100%;
-}
-
-#zoom-controls #zoom-in i,
-#zoom-controls #zoom-out i,
-#zoom-controls #zoom-reset i {
- color: #E89619;
-}
-
-#zoom-controls #zoom-in:hover,
-#zoom-controls #zoom-out:hover,
-#zoom-controls #zoom-reset:hover {
- background-color: rgba(255,255,255,0.2);
-}
-
-#zoom-controls #zoom-in:active,
-#zoom-controls #zoom-out:active,
-#zoom-controls #zoom-reset:active {
- border: none;
-}
-
-.fa-caret-right,
-.fa-caret-down {
- margin: 0 5px;
- color: #68b9fe;
-}
-
-#search {
- margin-top: 2em;
- margin-bottom: 1em;
- padding: .5em 1em;
- width: 100%;
-}
-
-#search span {
- vertical-align: bottom;
-}
-
-#search input {
- background-color: transparent;
- border: thin dashed #68B9FE;
- font-size: 20px;
- padding-left: 0.5em;
- margin-top: -1px;
-}
-
-#search input::-webkit-input-placeholder {
- color: white;
-}
-
-#search input:-moz-placeholder {
- color: white;
-}
-
-#search input::-moz-placeholder {
- color: white;
-}
-
-#search input:-ms-input-placeholder {
- color: white;
-}
-
-#search .search-icon {
- height: 22px;
- background-color: transparent;
- border: thin dashed #68B9FE;
- color: white;
-}
-
-#stats {
- padding: 0.5em 1em;
- background-color: transparent;
- border-bottom: thin dashed #68b9fe;
-}
-
-#stats #stats-header {
- padding: 10px;
-}
-
-#stats #all-stats {
- color: white;
- border-radius: none;
- border: none;
- background: transparent;
- overflow: auto;
-}
-
-#stats #all-stats li {
- padding: 3px;
-}
-
-#stats #node-stats-graph,
-#stats #edge-stats-graph {
- height: 250px;
-}
-
-#stats #node-stats-graph svg,
-#stats #edge-stats-graph svg {
- opacity: .6;
- background: transparent;
-}
-
-#stats #node-stats-graph text,
-#stats #edge-stats-graph text {
- font-size: 16px;
- fill: white;
- font-weight: 200;
- text-anchor: middle;
- z-index: 1000;
-}
-
-#stats #node-stats-graph .no-data,
-#stats #edge-stats-graph .no-data {
- margin: 30px 0;
- color: #68b9fe;
-}
-
-#stats .badge {
- border-radius: 0;
- height: 100%;
- background-color: rgba(104,185,254,0.6);
-}
-
-#editor {
- padding: 0.5em 1em;
- background-color: transparent;
- border-bottom: thin dashed #68b9fe;
-}
-
-#editor h3 {
- padding: 10px;
-}
-
-#editor #element-options {
- display: -webkit-flex;
- display: flex;
- -webkit-flex-direction: column;
- flex-direction: column;
- cursor: pointer;
- margin-top: 10px;
- margin-left: 2%;
- color: white;
-}
-
-#editor #element-options .node-property,
-#editor #element-options #node-add-property {
- display: -webkit-inline-flex;
- display: inline-flex;
- margin: 4px 0;
- width: 100%;
-}
-
-#editor #element-options .property-value,
-#editor #element-options #node-add-property #add-property #node-add-prop-value {
- border: thin rgba(255,255,255,0.2) solid;
- border-left: none;
- background-color: black;
- color: white;
- width: 100%;
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-#editor #element-options .property-name,
-#editor #element-options #node-add-property #add-property #node-add-prop-key {
- text-align: center;
- font-weight: 200;
- cursor: default;
- background: #2E2E2E;
- border: thin transparent solid;
- color: #68b9fe;
- border-right: none;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-#editor #element-options #node-add-property #add-property {
- display: -webkit-flex;
- display: flex;
- -webkit-flex-grow: 2;
- flex-grow: 2;
- -webkit-flex-direction: column;
- flex-direction: column;
-}
-
-#editor #element-options #node-add-property #add-property #node-add-prop-value {
- text-align: center;
- width: 100%;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 4px;
- border: thin rgba(255,255,255,0.2) solid;
-}
-
-#editor #element-options #node-add-property #add-property #node-add-prop-key {
- cursor: text;
- width: 100%;
- border-top-left-radius: 4px;
- border-bottom-left-radius: 0;
-}
-
-#editor #element-options input[type="submit"],
-#editor #element-options #update-properties {
- color: #68b9fe;
- border-top-right-radius: 4px;
- border-bottom-right-radius: 4px;
- width: auto;
- background: rgba(255,255,255,0.1);
- border: thin solid #68b9fe;
- text-align: center;
-}
-
-#editor #element-options input[type="submit"]:active,
-#editor #element-options #update-properties:active,
-#editor #element-options input[type="submit"]:focus,
-#editor #element-options #update-properties:focus {
- outline: none;
-}
-
-#editor #element-options input[type="submit"]:hover,
-#editor #element-options #update-properties:hover {
- color: white;
- border: thin solid white;
-}
-
-#editor #element-options #update-properties {
- border-radius: 4px;
- padding: 10px;
- width: 100%;
- margin-bottom: 20px;
-}
-
-#editor #editor-interactions.active {
- color: #68b9fe;
-}
-
-#editor #editor-interactions.inactive {
- color: white;
-}
-
-#editor #node-editor.enabled {
- -webkit-animation: fadeIn 1s linear;
- animation: fadeIn 1s linear;
-}
-
-#control-dash-wrapper {
- font-family: 'Source Sans Pro', Helvetica, sans-serif;
- letter-spacing: .05em;
- height: inherit;
- z-index: inherit;
- padding: 0;
-}
-
-#control-dash-wrapper.initial {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
-}
-
-#control-dash-wrapper.initial #dash-toggle {
- color: #68b9fe;
- -webkit-animation: 4s pulse linear;
- animation: 4s pulse linear;
-}
-
-#control-dash-wrapper.off-canvas {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- -webkit-animation: slide-out .75s linear;
- animation: slide-out .75s linear;
-}
-
-#control-dash-wrapper.off-canvas #dash-toggle {
- color: #68b9fe;
- -webkit-animation: 4s pulse linear;
- animation: 4s pulse linear;
-}
-
-#control-dash-wrapper.on-canvas {
- -webkit-animation: slide-in .75s ease-in-out;
- animation: slide-in .75s ease-in-out;
-}
-
-#control-dash-wrapper.on-canvas * {
- box-shadow: none !important;
-}
-
-#control-dash-wrapper.on-canvas #dash-toggle {
- color: rgba(104,185,254,0.6);
-}
-
-#control-dash-wrapper.on-canvas #dash-toggle:hover {
- color: #68b9fe;
- -webkit-animation: 4s pulse linear;
- animation: 4s pulse linear;
-}
-
-#control-dash-wrapper #control-dash {
- overflow-x: hidden;
- overflow-y: scroll;
- background-color: rgba(0,0,0,0.3);
- padding: 0;
- height: inherit;
- z-index: 5;
-}
-
-#control-dash-wrapper #control-dash h3 {
- display: inline;
- margin: 0;
-}
-
-#control-dash-wrapper #dash-toggle {
- z-index: 5;
- background-color: rgba(0,0,0,0.3);
- border-top-right-radius: 3px;
- border-bottom-right-radius: 3px;
- box-shadow: 0 0 5px rgba(255,255,255,0.3);
- position: absolute;
- left: 0;
- top: 50%;
- font-size: 2.2em;
- color: rgba(255,255,255,0.2);
- padding: 10px;
-}
-
-#control-dash-wrapper button {
- border-radius: 0;
- border: none;
- background-color: transparent;
-}
-
-#control-dash-wrapper button:active {
- border: none;
-}
-
-#control-dash-wrapper h3 {
- font-weight: 200;
- margin-top: 10px;
- color: white;
- cursor: pointer;
- vertical-align: top;
-}
-
-#control-dash-wrapper li {
- cursor: pointer;
- background: transparent;
- border: none;
- border-radius: 0;
-}
-
-.node {
- cursor: pointer;
-}
-
-.node text.root {
- font-size: 32px;
-}
-
-.node text {
- display: none;
- fill: white;
- font-weight: 200;
- text-anchor: middle;
- z-index: 1000;
- text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
-}
-
-.node.active {
- opacity: 1;
-}
-
-.node.active.selected text {
- display: block;
-}
-
-.node.active:hover text {
- display: block;
-}
-
-#filters {
- padding: 0.5em 1em;
- background-color: transparent;
- border-bottom: thin dashed #68b9fe;
- color: white;
-}
-
-#filters form {
- width: 100%;
-}
-
-#filters #filter-header {
- padding: 10px;
-}
-
-#filters #filter-relationships,
-#filters #filter-nodes {
- background-color: transparent;
- display: inline-block;
- width: 45%;
- margin-left: 2%;
- overflow: auto;
- text-align: center;
- vertical-align: top;
-}
-
-#filters #filter-relationships #filter-node-header,
-#filters #filter-relationships #filter-rel-header,
-#filters #filter-nodes #filter-node-header,
-#filters #filter-nodes #filter-rel-header {
- margin: 10px 0;
- cursor: pointer;
- background-color: transparent;
- border: none;
- border-radius: 0;
- width: 100%;
-}
-
-#filters #filter-relationships #filter-node-header h4,
-#filters #filter-relationships #filter-rel-header h4,
-#filters #filter-nodes #filter-node-header h4,
-#filters #filter-nodes #filter-rel-header h4 {
- font-weight: 200;
- display: inline;
- color: white;
-}
-
-#filters #filter-relationships #filter-node-header:active,
-#filters #filter-relationships #filter-rel-header:active,
-#filters #filter-nodes #filter-node-header:active,
-#filters #filter-nodes #filter-rel-header:active {
- border: none;
- box-shadow: none;
-}
-
-#filters #filter-relationships #rel-dropdown,
-#filters #filter-relationships #node-dropdown,
-#filters #filter-nodes #rel-dropdown,
-#filters #filter-nodes #node-dropdown {
- margin: 20px 0;
- border-radius: none;
- border: none;
- background: transparent;
-}
-
-#filters #filter-relationships #rel-dropdown li,
-#filters #filter-relationships #node-dropdown li,
-#filters #filter-nodes #rel-dropdown li,
-#filters #filter-nodes #node-dropdown li {
- padding: 5px;
-}
-
-#filters #filter-relationships #rel-dropdown li:hover,
-#filters #filter-relationships #node-dropdown li:hover,
-#filters #filter-nodes #rel-dropdown li:hover,
-#filters #filter-nodes #node-dropdown li:hover {
- background-color: rgba(255,255,255,0.2);
-}
-
-#filters .disabled {
- color: rgba(255,255,255,0.5);
-}
-
-#filters .disabled:hover {
- color: #68b9fe;
-}
-
-.alchemy {
- position: relative;
-}
-
-.alchemy #search form {
- z-index: 2;
- display: inline;
- margin-left: 100px;
-}
-
-.alchemy #add-tag {
- width: 300px;
- display: inline-block;
-}
-
-.alchemy #tags input {
- max-width: 220px;
-}
-
-.alchemy #tags-list {
- padding: 0;
-}
-
-.alchemy #tags-list .icon-remove-sign {
- cursor: pointer;
-}
-
-.alchemy #tags-list li {
- display: inline-block;
- margin-top: 5px;
-}
-
-.alchemy #tags-list span {
- background-color: #ccc;
- color: #333;
- border-radius: 10em;
- display: inline-block;
- padding: 1px 6px;
-}
-
-.alchemy #filter-nodes label,
-.alchemy #filter-relationships label {
- font-weight: normal;
- margin-right: 1em;
-}
-
-.alchemy .clear {
- clear: both;
-}
-
-.alchemy text {
- font-weight: 200;
- text-anchor: middle;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.css b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.css
deleted file mode 100644
index 6571ef0..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.css
+++ /dev/null
@@ -1,714 +0,0 @@
-@-webkit-keyframes fadeIn {
- 0% {
- opacity: 0;
- }
-
- 25% {
- opacity: .3;
- }
-
- 50% {
- opacity: .66;
- }
-
- 75% {
- opacity: 1;
- }
-}
-
-@keyframes fadeIn {
- 0% {
- opacity: 0;
- }
-
- 25% {
- opacity: .3;
- }
-
- 50% {
- opacity: .66;
- }
-
- 75% {
- opacity: 1;
- }
-}
-
-@-webkit-keyframes pulse {
- 0% {
- text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
- }
-
- 25% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
- }
-
- 50% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
- }
-
- 75% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
- }
-}
-
-@keyframes pulse {
- 0% {
- text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
- }
-
- 25% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
- }
-
- 50% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
- }
-
- 75% {
- text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
- }
-}
-
-@-webkit-keyframes slide-in {
- 0% {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- }
-
- 100% {
- -webkit-transform: translate(0%, 0);
- transform: translate(0%, 0);
- }
-}
-
-@keyframes slide-in {
- 0% {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- }
-
- 100% {
- -webkit-transform: translate(0%, 0);
- transform: translate(0%, 0);
- }
-}
-
-@-webkit-keyframes slide-out {
- 0% {
- -webkit-transform: translate(0%, 0);
- transform: translate(0%, 0);
- }
-
- 100% {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- }
-}
-
-@keyframes slide-out {
- 100% {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- }
-}
-
-svg {
- position: absolute;
- left: 0;
- cursor: -webkit-grab;
- height: 100%;
- width: 100%;
- color: #333;
-}
-
-.node {
- cursor: pointer;
-}
-
-.node text.root {
- font-size: 32px;
-}
-
-.node text {
- display: none;
- fill: white;
- font-weight: 200;
- text-anchor: middle;
- z-index: 1000;
- text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
-}
-
-.node.active {
- opacity: 1;
-}
-
-.node.active.selected text {
- display: block;
-}
-
-.node.active:hover text {
- display: block;
-}
-
-defs #arrow path {
- stroke: #CCC;
- stroke-opacity: 0.2;
- fill: #CCC;
- opacity: 1;
-}
-
-.edge text {
- stroke-width: 0;
-}
-
-.edge .edge-handler {
- fill: none;
- stroke: none;
-}
-
-.edge .edge-line {
- fill: none;
-}
-
-.edge.active text {
- display: none;
- fill: white;
- font-weight: 200;
- text-anchor: middle;
- text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
- z-index: 1000;
-}
-
-.edge.active:hover,
-.edge.active.selected {
- cursor: pointer;
-}
-
-.edge.active:hover text,
-.edge.active.selected text {
- display: block;
-}
-
-.edge.active.highlight text {
- display: block;
-}
-
-#zoom-controls {
- background-color: transparent;
- background-image: url("images/maze-black.png");
- border-top-right-radius: 3px;
- border-bottom-right-radius: 3px;
- box-shadow: 0 0 5px rgba(255,255,255,0.3);
- margin-top: 10%;
- z-index: 5;
- position: relative;
- display: block;
- width: 55px;
-}
-
-#zoom-controls #zoom-in,
-#zoom-controls #zoom-out,
-#zoom-controls #zoom-reset {
- padding: 12px;
- margin: 0;
- width: 100%;
-}
-
-#zoom-controls #zoom-in i,
-#zoom-controls #zoom-out i,
-#zoom-controls #zoom-reset i {
- color: #E89619;
-}
-
-#zoom-controls #zoom-in:hover,
-#zoom-controls #zoom-out:hover,
-#zoom-controls #zoom-reset:hover {
- background-color: rgba(255,255,255,0.2);
-}
-
-#zoom-controls #zoom-in:active,
-#zoom-controls #zoom-out:active,
-#zoom-controls #zoom-reset:active {
- border: none;
-}
-
-.fa-caret-right,
-.fa-caret-down,
-.fa-search {
- margin: 0 5px;
- color: #e89619;
-}
-
-#search {
- margin-top: 2em;
- margin-bottom: 1em;
- padding: .5em 1em;
- width: 100%;
-}
-
-#search span {
- vertical-align: bottom;
-}
-
-#search input {
- background-color: black;
- border: none;
- font-size: 20px;
- color: white;
- padding-left: 0.5em;
-}
-
-#search .search-icon {
- height: 22px;
- background-color: #000;
- border-color: #000;
- border-right-color: #111;
-}
-
-#stats {
- padding: 0.5em 1em;
- background-color: transparent;
- border-bottom: thin dashed #e89619;
-}
-
-#stats #stats-header {
- padding: 10px;
-}
-
-#stats #all-stats {
- color: white;
- border-radius: none;
- border: none;
- background: transparent;
- overflow: auto;
-}
-
-#stats #all-stats li {
- padding: 3px;
-}
-
-#stats #node-stats-graph,
-#stats #edge-stats-graph {
- height: 250px;
-}
-
-#stats #node-stats-graph svg,
-#stats #edge-stats-graph svg {
- opacity: .6;
- background: transparent;
-}
-
-#stats #node-stats-graph text,
-#stats #edge-stats-graph text {
- font-size: 16px;
- fill: white;
- font-weight: 200;
- text-anchor: middle;
- z-index: 1000;
-}
-
-#stats #node-stats-graph .no-data,
-#stats #edge-stats-graph .no-data {
- margin: 30px 0;
- color: #e89619;
-}
-
-#stats .badge {
- border-radius: 0;
- height: 100%;
- background-color: rgba(104,185,254,0.6);
-}
-
-#editor {
- padding: 0.5em 1em;
- background-color: transparent;
- border-bottom: thin dashed #e89619;
-}
-
-#editor h3 {
- padding: 10px;
-}
-
-#editor #element-options {
- display: -webkit-flex;
- display: flex;
- -webkit-flex-direction: column;
- flex-direction: column;
- cursor: pointer;
- margin-top: 10px;
- margin-left: 2%;
- color: white;
-}
-
-#editor #element-options .property,
-#editor #element-options #add-property-form {
- display: -webkit-inline-flex;
- display: inline-flex;
- margin: 4px 0;
- width: 100%;
-}
-
-#editor #element-options .property-value,
-#editor #element-options #add-property-form #add-property #add-prop-value {
- border: thin rgba(255,255,255,0.2) solid;
- border-left: none;
- background-color: black;
- color: white;
- width: 100%;
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-#editor #element-options .property-name,
-#editor #element-options #add-property-form #add-property #add-prop-key {
- text-align: center;
- font-weight: 200;
- cursor: default;
- background: #2E2E2E;
- border: thin transparent solid;
- color: #e89619;
- border-right: none;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-#editor #element-options input[type="submit"],
-#editor #element-options #update-properties {
- color: #e89619;
- border-top-right-radius: 4px;
- border-bottom-right-radius: 4px;
- width: auto;
- background: rgba(255,255,255,0.1);
- border: thin solid #e89619;
- text-align: center;
-}
-
-#editor #element-options input[type="submit"]:active,
-#editor #element-options #update-properties:active,
-#editor #element-options input[type="submit"]:focus,
-#editor #element-options #update-properties:focus {
- outline: none;
-}
-
-#editor #element-options input[type="submit"]:hover,
-#editor #element-options #update-properties:hover {
- color: white;
- border: thin solid white;
-}
-
-#editor #element-options #update-properties {
- border-radius: 4px;
- padding: 10px;
- width: 100%;
- margin-bottom: 20px;
-}
-
-#editor #element-options #add-property-form #add-property {
- display: -webkit-flex;
- display: flex;
- -webkit-flex-grow: 2;
- flex-grow: 2;
- -webkit-flex-direction: column;
- flex-direction: column;
-}
-
-#editor #element-options #add-property-form #add-property #add-prop-value {
- text-align: center;
- width: 100%;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 4px;
- border: thin rgba(255,255,255,0.2) solid;
-}
-
-#editor #element-options #add-property-form #add-property #add-prop-key {
- cursor: text;
- width: 100%;
- border-top-left-radius: 4px;
- border-bottom-left-radius: 0;
-}
-
-#editor #editor-interactions.active {
- color: #e89619;
-}
-
-#editor #editor-interactions.inactive {
- color: white;
-}
-
-#editor #node-editor.enabled,
-#editor #edge-editor.enabled {
- -webkit-animation: fadeIn 1s linear;
- animation: fadeIn 1s linear;
-}
-
-#control-dash-wrapper {
- font-family: 'Source Sans Pro', Helvetica, sans-serif;
- letter-spacing: .05em;
- height: inherit;
- z-index: inherit;
- padding: 0;
-}
-
-#control-dash-wrapper.initial {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
-}
-
-#control-dash-wrapper.initial #dash-toggle {
- color: #e89619;
- -webkit-animation: 4s pulse linear;
- animation: 4s pulse linear;
-}
-
-#control-dash-wrapper.off-canvas {
- -webkit-transform: translate(-100%, 0);
- transform: translate(-100%, 0);
- -webkit-animation: slide-out .75s linear;
- animation: slide-out .75s linear;
-}
-
-#control-dash-wrapper.off-canvas #dash-toggle {
- color: #e89619;
- -webkit-animation: 4s pulse linear;
- animation: 4s pulse linear;
-}
-
-#control-dash-wrapper.on-canvas {
- -webkit-animation: slide-in .75s ease-in-out;
- animation: slide-in .75s ease-in-out;
-}
-
-#control-dash-wrapper.on-canvas * {
- box-shadow: none !important;
-}
-
-#control-dash-wrapper.on-canvas #dash-toggle {
- color: rgba(232,150,25,0.6);
-}
-
-#control-dash-wrapper.on-canvas #dash-toggle:hover {
- color: #e89619;
- -webkit-animation: 4s pulse linear;
- animation: 4s pulse linear;
-}
-
-#control-dash-wrapper #control-dash {
- overflow-x: hidden;
- overflow-y: scroll;
- background-color: transparent;
- background-image: url("images/maze-black.png");
- padding: 0;
- height: inherit;
- z-index: 5;
-}
-
-#control-dash-wrapper #control-dash h3 {
- display: inline;
- margin: 0;
-}
-
-#control-dash-wrapper #dash-toggle {
- z-index: 5;
- background-color: transparent;
- background-image: url("images/maze-black.png");
- border-top-right-radius: 3px;
- border-bottom-right-radius: 3px;
- box-shadow: 0 0 5px rgba(255,255,255,0.3);
- position: absolute;
- left: 0;
- top: 50%;
- font-size: 2.2em;
- color: rgba(255,255,255,0.2);
- padding: 10px;
-}
-
-#control-dash-wrapper button {
- border-radius: 0;
- border: none;
- background-color: transparent;
-}
-
-#control-dash-wrapper button:active {
- border: none;
-}
-
-#control-dash-wrapper h3 {
- font-weight: 200;
- margin-top: 10px;
- color: white;
- cursor: pointer;
- vertical-align: top;
-}
-
-#control-dash-wrapper li {
- cursor: pointer;
- background: transparent;
- border: none;
- border-radius: 0;
-}
-
-#clustering {
- padding: 0.5em 1em;
- cursor: pointer;
- color: white;
- border-bottom: thin dashed #E89619;
-}
-
-#clustering #cluster_control_header,
-#clustering #cluster-key-container {
- padding: 10px 10px 0 10px;
-}
-
-#clustering #cluster-key {
- color: #333;
- background-color: #000;
- border-radius: 4px;
- border: thin solid #333;
- text-align: center;
- display: inline-block;
- width: 100%;
-}
-
-#filters {
- padding: 0.5em 1em;
- background-color: transparent;
- border-bottom: thin dashed #e89619;
- color: white;
-}
-
-#filters form {
- width: 100%;
-}
-
-#filters #filter-header {
- padding: 10px;
-}
-
-#filters #filter-relationships,
-#filters #filter-nodes {
- background-color: transparent;
- display: inline-block;
- width: 45%;
- margin-left: 2%;
- overflow: auto;
- text-align: center;
- vertical-align: top;
-}
-
-#filters #filter-relationships #filter-node-header,
-#filters #filter-relationships #filter-rel-header,
-#filters #filter-nodes #filter-node-header,
-#filters #filter-nodes #filter-rel-header {
- margin: 10px 0;
- cursor: pointer;
- background-color: transparent;
- border: none;
- border-radius: 0;
- width: 100%;
-}
-
-#filters #filter-relationships #filter-node-header h4,
-#filters #filter-relationships #filter-rel-header h4,
-#filters #filter-nodes #filter-node-header h4,
-#filters #filter-nodes #filter-rel-header h4 {
- font-weight: 200;
- display: inline;
- color: white;
-}
-
-#filters #filter-relationships #filter-node-header:active,
-#filters #filter-relationships #filter-rel-header:active,
-#filters #filter-nodes #filter-node-header:active,
-#filters #filter-nodes #filter-rel-header:active {
- border: none;
- box-shadow: none;
-}
-
-#filters #filter-relationships #rel-dropdown,
-#filters #filter-relationships #node-dropdown,
-#filters #filter-nodes #rel-dropdown,
-#filters #filter-nodes #node-dropdown {
- margin: 20px 0;
- border-radius: none;
- border: none;
- background: transparent;
-}
-
-#filters #filter-relationships #rel-dropdown li,
-#filters #filter-relationships #node-dropdown li,
-#filters #filter-nodes #rel-dropdown li,
-#filters #filter-nodes #node-dropdown li {
- padding: 5px;
-}
-
-#filters #filter-relationships #rel-dropdown li:hover,
-#filters #filter-relationships #node-dropdown li:hover,
-#filters #filter-nodes #rel-dropdown li:hover,
-#filters #filter-nodes #node-dropdown li:hover {
- background-color: rgba(255,255,255,0.2);
-}
-
-#filters .disabled {
- color: rgba(255,255,255,0.5);
-}
-
-#filters .disabled:hover {
- color: #fdc670;
-}
-
-.alchemy {
- position: relative;
-}
-
-.alchemy #search form {
- z-index: 2;
- display: inline;
- margin-left: 100px;
-}
-
-.alchemy #add-tag {
- width: 300px;
- display: inline-block;
-}
-
-.alchemy #tags input {
- max-width: 220px;
-}
-
-.alchemy #tags-list {
- padding: 0;
-}
-
-.alchemy #tags-list .icon-remove-sign {
- cursor: pointer;
-}
-
-.alchemy #tags-list li {
- display: inline-block;
- margin-top: 5px;
-}
-
-.alchemy #tags-list span {
- background-color: #ccc;
- color: #333;
- border-radius: 10em;
- display: inline-block;
- padding: 1px 6px;
-}
-
-.alchemy #filter-nodes label,
-.alchemy #filter-relationships label {
- font-weight: normal;
- margin-right: 1em;
-}
-
-.alchemy .clear {
- clear: both;
-}
-
-.alchemy text {
- font-weight: 200;
- text-anchor: middle;
-}
\ No newline at end of file
[19/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FormState.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FormState.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FormState.java
deleted file mode 100644
index 7349837..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/FormState.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.edit;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-public class FormState {
- private final Map<String, FieldEditState> fields = new HashMap<String, FieldEditState>();
- private String error;
- private String formId;
-
- public FieldEditState createField(final String name, final String entry) {
- final FieldEditState fieldEditState = new FieldEditState(entry);
- fields.put(name, fieldEditState);
- return fieldEditState;
- }
-
- public boolean isValid() {
- final Iterator<FieldEditState> iterator = fields.values().iterator();
- while (iterator.hasNext()) {
- if (!iterator.next().isEntryValid()) {
- return false;
- }
- }
- return error == null;
- }
-
- public FieldEditState getField(final String name) {
- return fields.get(name);
- }
-
- public void setError(final String error) {
- this.error = error;
- }
-
- public String getError() {
- return error;
- }
-
- public void setForm(final String formId) {
- this.formId = formId;
- }
-
- public boolean isForForm(final String formId) {
- return this.formId == null || this.formId.equals(formId);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/RemoveAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/RemoveAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/RemoveAction.java
deleted file mode 100644
index 919ccc2..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/RemoveAction.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.edit;
-
-import java.io.IOException;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.authentication.AnonymousSession;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.Action;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-
-/**
- * Remove an element from a collection.
- */
-public class RemoveAction implements Action {
- public static final String ACTION = "remove";
-
- // REVIEW: confirm this rendering context
- private final Where where = Where.OBJECT_FORMS;
-
- @Override
- public String getName() {
- return ACTION;
- }
-
- @Override
- public void process(final RequestContext context) throws IOException {
- AuthenticationSession session = context.getSession();
- if (session == null) {
- session = new AnonymousSession();
- }
-
- final String parentId = context.getParameter(OBJECT);
- final String rowId = context.getParameter(ELEMENT);
-
- try {
- final ObjectAdapter parent = context.getMappedObject(parentId);
- final ObjectAdapter row = context.getMappedObject(rowId);
-
- final String fieldName = context.getParameter(FIELD);
- final ObjectAssociation field = parent.getSpecification().getAssociation(fieldName);
- if (field == null) {
- throw new ScimpiException("No field " + fieldName + " in " + parent.getSpecification().getFullIdentifier());
- }
- if (field.isVisible(IsisContext.getAuthenticationSession(), parent, where).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
-
- ((OneToManyAssociation) field).removeElement(parent, row);
-
- // TODO duplicated in EditAction
- String view = context.getParameter(VIEW);
- final String override = context.getParameter(RESULT_OVERRIDE);
-
- String resultName = context.getParameter(RESULT_NAME);
- resultName = resultName == null ? RequestContext.RESULT : resultName;
-
- final String id = context.mapObject(parent, Scope.REQUEST);
- context.addVariable(resultName, id, Scope.REQUEST);
- if (override != null) {
- context.addVariable(resultName, override, Scope.REQUEST);
- }
-
- final int questionMark = view == null ? -1 : view.indexOf("?");
- if (questionMark > -1) {
- final String params = view.substring(questionMark + 1);
- final int equals = params.indexOf("=");
- context.addVariable(params.substring(0, equals), params.substring(equals + 1), Scope.REQUEST);
- view = view.substring(0, questionMark);
- }
- context.setRequestPath(view);
- // TODO end of duplication
-
- } catch (final RuntimeException e) {
- IsisContext.getMessageBroker().getMessages();
- IsisContext.getMessageBroker().getWarnings();
- throw e;
- }
- }
-
- @Override
- public void init() {
- }
-
- @Override
- public void debug(final DebugBuilder debug) {
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/DomainSession.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/DomainSession.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/DomainSession.java
deleted file mode 100644
index 55809e0..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/DomainSession.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.logon;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSessionAbstract;
-import org.apache.isis.core.commons.encoding.DataInputExtended;
-
-public class DomainSession extends AuthenticationSessionAbstract {
-
- private static final long serialVersionUID = 1L;
-
- private static final String CODE = "";
-
- public DomainSession(final String username, final List<String> roles) {
- super(username, roles, CODE);
- }
-
- public DomainSession(final DataInputExtended input) throws IOException {
- super(input);
- }
-}
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogonAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogonAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogonAction.java
deleted file mode 100644
index e90740a..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogonAction.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.logon;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.authentication.AuthenticationRequestPassword;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.Action;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.UserManager;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-
-public class LogonAction implements Action {
-
- @Override
- public void process(final RequestContext context) throws IOException {
- String username = context.getParameter("username");
- String password = context.getParameter("password");
- final String actualFormId = context.getParameter("_" + FORM_ID);
- final String expectedFormId = context.getParameter(LOGON_FORM_ID);
- boolean isDomainLogon = expectedFormId != null && expectedFormId.equals(actualFormId);
- boolean isValid;
-
- if (username == null || password == null) {
- context.redirectTo("/");
- return;
- }
- AuthenticationSession session = null;
- if (username.length() == 0 || password.length() == 0) {
- isValid = false;
- } else {
- if (isDomainLogon) {
- final String objectId = context.getParameter(LOGON_OBJECT);
- final String scope = context.getParameter(LOGON_SCOPE);
- final String loginMethodName = context.getParameter(LOGON_METHOD);
- final String roleFieldName = context.getParameter(PREFIX + "roles-field");
- String resultName = context.getParameter(LOGON_RESULT_NAME);
- resultName = resultName == null ? "_" + USER : resultName;
-
- final ObjectAdapter object = MethodsUtils.findObject(context, objectId);
- final ObjectAction loginAction = MethodsUtils.findAction(object, loginMethodName);
- final int parameterCount = loginAction.getParameterCount();
- final ObjectAdapter[] parameters = new ObjectAdapter[parameterCount];
- List<ObjectActionParameter> parameters2 = loginAction.getParameters();
- if (parameters.length != 2) {
- throw new ScimpiException("Expected two parameters for the log-on method: " + loginMethodName);
- }
-
- Localization localization = IsisContext.getLocalization();
- ParseableFacet facet = parameters2.get(0).getSpecification().getFacet(ParseableFacet.class);
- parameters[0] = facet.parseTextEntry(null, username, localization);
- facet = parameters2.get(1).getSpecification().getFacet(ParseableFacet.class);
- parameters[1] = facet.parseTextEntry(null, password, localization);
- final ObjectAdapter result = loginAction.execute(object, parameters);
- isValid = result != null;
- if (isValid) {
- ObjectSpecification specification = result.getSpecification();
- ObjectAssociation association = specification.getAssociation(roleFieldName);
- if (association == null) {
- throw new ScimpiException("Expected a role name field called: " + roleFieldName);
- }
- ObjectAdapter role = association.get(result);
- List<String> roles = new ArrayList<String>();
- if (role != null) {
- String[] split = role.titleString().split("\\|");
- for (String r : split) {
- roles.add(r);
- }
- }
- //String domainRoleName = role == null ? "" : role.titleString();
-
-
- Scope scope2 = scope == null ? Scope.SESSION : RequestContext.scope(scope);
- final String resultId = context.mapObject(result, scope2);
- context.addVariable(resultName, resultId, scope);
- context.addVariable("_username", username, Scope.SESSION);
-
- context.clearVariable(LOGON_OBJECT, Scope.SESSION);
- context.clearVariable(LOGON_METHOD, Scope.SESSION);
- context.clearVariable(LOGON_RESULT_NAME, Scope.SESSION);
- context.clearVariable(LOGON_SCOPE, Scope.SESSION);
- context.clearVariable(PREFIX + "roles-field", Scope.SESSION);
- // context.clearVariable(PREFIX + "isis-user", Scope.SESSION);
- context.clearVariable(LOGON_FORM_ID, Scope.SESSION);
-
- session = new DomainSession(result.titleString(), roles);
- } else {
- session = context.getSession();
- }
-
- } else {
- session = UserManager.authenticate(new AuthenticationRequestPassword(username, password));
- isValid = session != null;
- }
- }
-
- String view;
- if (!isValid) {
- final FormState formState = new FormState();
- formState.setForm(actualFormId);
- formState.setError("Failed to login. Check the username and ensure that your password was entered correctly");
- FieldEditState fieldState = formState.createField("username", username);
- if (username.length() == 0) {
- fieldState.setError("User Name required");
- }
- fieldState = formState.createField("password", password);
- if (password.length() == 0) {
- fieldState.setError("Password required");
- }
- if (username.length() == 0 || password.length() == 0) {
- formState.setError("Both the user name and password must be entered");
- }
- context.addVariable(ENTRY_FIELDS, formState, Scope.REQUEST);
-
- view = context.getParameter(ERROR);
- context.setRequestPath("/" + view, Dispatcher.ACTION);
- } else {
- context.setSession(session);
- context.startHttpSession();
- context.setUserAuthenticated(true);
- view = context.getParameter(VIEW);
- if (view == null) {
- // REVIEW this is duplicated in Logon.java
- view = "start." + Dispatcher.EXTENSION;
- }
- context.redirectTo(view);
- }
- }
-
- @Override
- public String getName() {
- return "logon";
- }
-
- @Override
- public void init() {}
-
- @Override
- public void debug(final DebugBuilder debug) {}
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogoutAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogoutAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogoutAction.java
deleted file mode 100644
index a6f4730..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/logon/LogoutAction.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.logon;
-
-import java.io.IOException;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.Action;
-import org.apache.isis.viewer.scimpi.dispatcher.UserManager;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-
-public class LogoutAction implements Action {
-
- public static void logoutUser(final RequestContext context) {
- if (context.isUserAuthenticated()) {
- final AuthenticationSession session = context.getSession();
- if (session != null) {
- UserManager.logoffUser(session);
- }
- context.endHttpSession();
- context.setUserAuthenticated(false);
- }
- context.clearVariables(Scope.SESSION);
- }
-
- @Override
- public String getName() {
- return "logout";
- }
-
- @Override
- public void init() {
- }
-
- @Override
- public void process(final RequestContext context) throws IOException {
- logoutUser(context);
-
- String view = context.getParameter("view");
- if (view == null) {
- view = context.getContextPath();
- }
- context.redirectTo(view);
- }
-
- @Override
- public void debug(final DebugBuilder debug) {
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Encoder.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Encoder.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Encoder.java
deleted file mode 100644
index 1efe91e..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Encoder.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.processor;
-
-public interface Encoder {
-
- String encoder(String text);
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/HtmlFileParser.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/HtmlFileParser.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/HtmlFileParser.java
deleted file mode 100644
index 6730510..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/HtmlFileParser.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.processor;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Stack;
-
-import org.htmlparser.Node;
-import org.htmlparser.Remark;
-import org.htmlparser.lexer.Lexer;
-import org.htmlparser.lexer.Page;
-import org.htmlparser.nodes.TagNode;
-import org.htmlparser.util.ParserException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.action.Attributes;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.view.HtmlSnippet;
-import org.apache.isis.viewer.scimpi.dispatcher.view.Snippet;
-import org.apache.isis.viewer.scimpi.dispatcher.view.SwfTag;
-
-public class HtmlFileParser {
- private static final Logger LOG = LoggerFactory.getLogger(HtmlFileParser.class);
- private final ProcessorLookup processors;
-
- public HtmlFileParser(final ProcessorLookup processors) {
- this.processors = processors;
- }
-
- public Stack<Snippet> parseHtmlFile(final String filePath, final RequestContext context) {
- final Stack<Snippet> tagsBeforeContent = new Stack<Snippet>();
- final Stack<Snippet> tagsAfterContent = new Stack<Snippet>();
- parseHtmlFile("/", filePath, context, tagsBeforeContent, tagsAfterContent);
- return tagsBeforeContent;
- }
-
- public void parseHtmlFile(final String parentPath, final String filePath, final RequestContext context, final Stack<Snippet> allTags, final Stack<Snippet> tagsForPreviousTemplate) {
- LOG.debug("parent/file: " + parentPath + " & " + filePath);
- final File directory = filePath.startsWith("/") ? new File(".") : new File(parentPath);
- final File loadFile = new File(directory.getParentFile(), filePath);
- final String loadPath = loadFile.getPath().replace('\\', '/');
- LOG.debug("loading template '" + loadPath + "'");
- final InputStream in = context.openStream(loadPath);
-
- Page page;
- try {
- page = new Page(in, null);
- } catch (final UnsupportedEncodingException e) {
- throw new ScimpiException(e);
- }
- final Lexer lexer = new Lexer(page);
-
- Node node = null;
- try {
- Stack<Snippet> tags = allTags;
- String lineNumbers = "1";
- String template = null;
- tags.push(new HtmlSnippet(lineNumbers, filePath));
-
- // NOTE done like this the tags can be cached for faster processing
- while ((node = lexer.nextNode()) != null) {
- if (node instanceof Remark) {
- // TODO need to pick up on comments within tags; at the
- // moment this splits a tag into two causing a
- // failure later
- continue;
-
- } else if (node instanceof TagNode && ((TagNode) node).getTagName().startsWith("SWF:")) {
- final TagNode tagNode = (TagNode) node;
- final String tagName = tagNode.getTagName().toUpperCase();
- LOG.debug(tagName);
-
- // TODO remove context & request from Attributes -- the tags
- // will be re-used across
- // requests
- final Attributes attributes = new Attributes(tagNode, context);
- int type = 0;
- if (tagNode.isEndTag()) {
- type = SwfTag.END;
- } else {
- type = tagNode.isEmptyXmlTag() ? SwfTag.EMPTY : SwfTag.START;
- }
- testForProcessorForTag(lexer, tagName);
- lineNumbers = lineNumbering(node);
- final SwfTag tag = new SwfTag(tagName, attributes, type, lineNumbers, loadFile.getCanonicalPath());
- tags.push(tag);
-
- if (tagName.equals("SWF:IMPORT")) {
- if (!tagNode.isEmptyXmlTag()) {
- throw new ScimpiException("Import tag must be empty");
- }
- String importFile = tagNode.getAttribute("file");
- if (context.isDebug()) {
- context.getWriter().println("<!-- " + "import file " + importFile + " -->");
- }
- importFile = context.replaceVariables(importFile);
- parseHtmlFile(loadPath, importFile, context, tags, tagsForPreviousTemplate);
- }
-
- if (tagName.equals("SWF:TEMPLATE")) {
- if (!tagNode.isEmptyXmlTag()) {
- throw new ScimpiException("Template tag must be empty");
- }
- if (template != null) {
- throw new ScimpiException("Template tag can only be used once within a file");
- }
- template = tagNode.getAttribute("file");
- template = context.replaceVariables(template);
- if (context.isDebug()) {
- context.getWriter().println("<!-- " + "apply template " + template + " -->");
- }
- tags = new Stack<Snippet>();
- }
-
- if (tagName.equals("SWF:CONTENT")) {
- if (!tagNode.isEmptyXmlTag()) {
- throw new ScimpiException("Content tag must be empty");
- }
- if (context.isDebug()) {
- context.getWriter().println("<!-- " + "insert content into template -->");
- }
- tags.addAll(tagsForPreviousTemplate);
- }
- } else {
- final Snippet snippet = tags.size() == 0 ? null : tags.peek();
- if (snippet instanceof HtmlSnippet) {
- ((HtmlSnippet) snippet).append(node.toHtml());
- } else {
- final HtmlSnippet htmlSnippet = new HtmlSnippet(lineNumbers, filePath);
- htmlSnippet.append(node.toHtml());
- tags.push(htmlSnippet);
- }
- }
-
- }
- in.close();
-
- if (template != null) {
- final String filePathRoot = loadPath.startsWith("/") ? "" : "/";
- parseHtmlFile(filePathRoot + loadPath, template, context, allTags, tags);
- }
-
- } catch (final ParserException e) {
- exception(loadPath, node, e);
- // throw new ScimpiException(e);
- } catch (final RuntimeException e) {
- // TODO: extend to deal with other exceptions
- exception(loadPath, node, e);
- } catch (final IOException e) {
- throw new ScimpiException(e);
- }
- }
-
- private void exception(final String filePath, final Node node, final Exception e) {
- String lineNumbers = "";
- String element = ("" + node).toLowerCase();
- if (node instanceof TagNode) {
- lineNumbers = ":" + lineNumbering(node);
- element = "tag <" + node.getText() + ">";
- }
- throw new ScimpiException("Error processing " + element + " in " + filePath + lineNumbers, e);
- }
-
- private String lineNumbering(final Node node) {
- String lineNumbers;
- final int startingLine = ((TagNode) node).getStartingLineNumber() + 1;
- final int endingLine = ((TagNode) node).getStartingLineNumber() + 1;
- if (startingLine == endingLine) {
- lineNumbers = "" + startingLine;
- } else {
- lineNumbers = startingLine + "-" + endingLine;
- }
- return lineNumbers;
- }
-
- private void testForProcessorForTag(final Lexer lexer, final String tagName) {
- final ElementProcessor elementProcessor = processors.getFor(tagName);
- if (elementProcessor == null) {
- throw new ScimpiException("No processor for tag " + tagName.toLowerCase());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/PageWriter.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/PageWriter.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/PageWriter.java
deleted file mode 100644
index 4e11481..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/PageWriter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.processor;
-
-public interface PageWriter {
-
- void appendAsHtmlEncoded(String string);
-
- void appendHtml(String string);
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/ProcessorLookup.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/ProcessorLookup.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/ProcessorLookup.java
deleted file mode 100644
index 36c1920..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/ProcessorLookup.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.processor;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeSet;
-
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsersView;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.ErrorDetails;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.ErrorMessage;
-import org.apache.isis.viewer.scimpi.dispatcher.debug.ErrorReference;
-import org.apache.isis.viewer.scimpi.dispatcher.view.HelpLink;
-import org.apache.isis.viewer.scimpi.dispatcher.view.History;
-import org.apache.isis.viewer.scimpi.dispatcher.view.VersionNumber;
-import org.apache.isis.viewer.scimpi.dispatcher.view.action.ActionButton;
-import org.apache.isis.viewer.scimpi.dispatcher.view.action.ActionForm;
-import org.apache.isis.viewer.scimpi.dispatcher.view.action.ActionLink;
-import org.apache.isis.viewer.scimpi.dispatcher.view.action.Methods;
-import org.apache.isis.viewer.scimpi.dispatcher.view.action.Parameter;
-import org.apache.isis.viewer.scimpi.dispatcher.view.action.RunAction;
-import org.apache.isis.viewer.scimpi.dispatcher.view.action.Services;
-import org.apache.isis.viewer.scimpi.dispatcher.view.collection.Collection;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.DebugAccessCheck;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.DebugCollectionView;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.DebugObjectView;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.DebuggerLink;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.Diagnostics;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.Log;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.LogLevel;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.Members;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.ShowDebug;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.Specification;
-import org.apache.isis.viewer.scimpi.dispatcher.view.debug.ThrowException;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.AddMessage;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.AddWarning;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.Errors;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.Feedback;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.FieldLabel;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.FieldValue;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.GetField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.IncludeObject;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.ListView;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.LongFormView;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.Messages;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.SelectedObject;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.ShortFormView;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableBuilder;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableCell;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableEmpty;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableHeader;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableRow;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableView;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.Title;
-import org.apache.isis.viewer.scimpi.dispatcher.view.display.Warnings;
-import org.apache.isis.viewer.scimpi.dispatcher.view.edit.EditObject;
-import org.apache.isis.viewer.scimpi.dispatcher.view.edit.FormEntry;
-import org.apache.isis.viewer.scimpi.dispatcher.view.edit.FormField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.edit.HiddenField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.edit.RadioListField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.edit.Selector;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.ExcludeField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.IncludeField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.logon.Logoff;
-import org.apache.isis.viewer.scimpi.dispatcher.view.logon.Logon;
-import org.apache.isis.viewer.scimpi.dispatcher.view.logon.RestrictAccess;
-import org.apache.isis.viewer.scimpi.dispatcher.view.logon.Secure;
-import org.apache.isis.viewer.scimpi.dispatcher.view.logon.User;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.BlockDefine;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.BlockUse;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Commit;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.ContentTag;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.CookieValue;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.DefaultValue;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.EditLink;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.EndSession;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Forward;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.GetCookie;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Import;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.InitializeFromCookie;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.InitializeFromResult;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Localization;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Mark;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.NewActionLink;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.ObjectLink;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.PageTitle;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Redirect;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.RemoveElement;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.ScopeTag;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SetCookie;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SetCookieFromField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SetFieldFromCookie;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SetLocalization;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.SimpleButton;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.StartSession;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.TemplateTag;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Unless;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.Variable;
-import org.apache.isis.viewer.scimpi.dispatcher.view.simple.When;
-import org.apache.isis.viewer.scimpi.dispatcher.view.value.ActionName;
-import org.apache.isis.viewer.scimpi.dispatcher.view.value.CountElements;
-import org.apache.isis.viewer.scimpi.dispatcher.view.value.ElementType;
-import org.apache.isis.viewer.scimpi.dispatcher.view.value.FieldName;
-import org.apache.isis.viewer.scimpi.dispatcher.view.value.ParameterName;
-import org.apache.isis.viewer.scimpi.dispatcher.view.value.TitleString;
-import org.apache.isis.viewer.scimpi.dispatcher.view.value.Type;
-
-public class ProcessorLookup {
- private final Map<String, ElementProcessor> swfElementProcessors = new HashMap<String, ElementProcessor>();
-
- public void init() {
- addElementProcessor(new ActionLink());
- addElementProcessor(new ActionButton());
- addElementProcessor(new ActionForm());
- addElementProcessor(new ActionName());
- addElementProcessor(new AddMessage());
- addElementProcessor(new AddWarning());
- addElementProcessor(new BlockDefine());
- addElementProcessor(new BlockUse());
- addElementProcessor(new History());
- addElementProcessor(new Collection());
- addElementProcessor(new Commit());
- addElementProcessor(new ContentTag());
- addElementProcessor(new CountElements());
- addElementProcessor(new Diagnostics());
- addElementProcessor(new DebugAccessCheck());
- addElementProcessor(new DebugCollectionView());
- addElementProcessor(new DebuggerLink());
- addElementProcessor(new DebugObjectView());
- addElementProcessor(new DebugUsersView());
- addElementProcessor(new DefaultValue());
- addElementProcessor(new EditLink());
- addElementProcessor(new EditObject());
- addElementProcessor(new ElementType());
- addElementProcessor(new Errors());
- addElementProcessor(new ErrorDetails());
- addElementProcessor(new ErrorMessage());
- addElementProcessor(new ErrorReference());
- addElementProcessor(new ExcludeField());
- addElementProcessor(new Feedback());
- addElementProcessor(new FieldLabel());
- addElementProcessor(new FieldName());
- addElementProcessor(new FieldValue());
- addElementProcessor(new FormField());
- addElementProcessor(new FormEntry());
- addElementProcessor(new Forward());
- addElementProcessor(new GetField());
- addElementProcessor(new HelpLink());
- addElementProcessor(new HiddenField());
- addElementProcessor(new Import());
- addElementProcessor(new IncludeObject());
- addElementProcessor(new IncludeField());
- addElementProcessor(new InitializeFromCookie());
- addElementProcessor(new InitializeFromResult());
- addElementProcessor(new Log());
- addElementProcessor(new LogLevel());
- addElementProcessor(new Logon());
- addElementProcessor(new Logoff());
- addElementProcessor(new LongFormView());
- addElementProcessor(new LinkField());
- addElementProcessor(new ListView());
- addElementProcessor(new NewActionLink());
- addElementProcessor(new Mark());
- addElementProcessor(new Members());
- addElementProcessor(new Messages());
- addElementProcessor(new Methods());
- addElementProcessor(new ObjectLink());
- addElementProcessor(new PageTitle());
- addElementProcessor(new Parameter());
- addElementProcessor(new ParameterName());
- addElementProcessor(new RadioListField());
- addElementProcessor(new Redirect());
- addElementProcessor(new RemoveElement());
- addElementProcessor(new VersionNumber());
- addElementProcessor(new RunAction());
- addElementProcessor(new RestrictAccess());
- addElementProcessor(new ScopeTag());
- addElementProcessor(new Secure());
- addElementProcessor(new SelectedObject());
- addElementProcessor(new Selector());
- addElementProcessor(new Services());
- addElementProcessor(new ShortFormView());
- addElementProcessor(new ShowDebug());
- addElementProcessor(new SimpleButton());
- addElementProcessor(new Specification());
- addElementProcessor(new TableCell());
- addElementProcessor(new TableView());
- addElementProcessor(new TableBuilder());
- addElementProcessor(new TableEmpty());
- addElementProcessor(new TableRow());
- addElementProcessor(new TableHeader());
- addElementProcessor(new TemplateTag());
- addElementProcessor(new Title());
- addElementProcessor(new TitleString());
- addElementProcessor(new ThrowException());
- addElementProcessor(new Type());
- addElementProcessor(new User());
- addElementProcessor(new Unless());
- addElementProcessor(new Variable());
- addElementProcessor(new Warnings());
- addElementProcessor(new When());
-
- addElementProcessor(new StartSession());
- addElementProcessor(new EndSession());
-
- addElementProcessor(new CookieValue());
- addElementProcessor(new SetCookie());
- addElementProcessor(new GetCookie());
- addElementProcessor(new SetCookieFromField());
- addElementProcessor(new SetFieldFromCookie());
-
- // new, alpha, processors
- addElementProcessor(new Localization());
- addElementProcessor(new SetLocalization());
- }
-
- public void addElementProcessor(final ElementProcessor action) {
- swfElementProcessors.put("SWF:" + action.getName().toUpperCase(), action);
- }
-
- public void debug(final DebugBuilder debug) {
- debug.startSection("Recognised tags");
- final Iterator<String> it2 = new TreeSet<String>(swfElementProcessors.keySet()).iterator();
- while (it2.hasNext()) {
- final String name = it2.next();
- debug.appendln(name.toLowerCase(), swfElementProcessors.get(name));
- }
- debug.endSection();
- }
-
- public ElementProcessor getFor(final String name) {
- return swfElementProcessors.get(name);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Request.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Request.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Request.java
deleted file mode 100644
index 118ff9b..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/Request.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.processor;
-
-import java.util.Stack;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.viewer.scimpi.dispatcher.BlockContent;
-import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.action.Attributes;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.view.HtmlSnippet;
-import org.apache.isis.viewer.scimpi.dispatcher.view.Snippet;
-import org.apache.isis.viewer.scimpi.dispatcher.view.SwfTag;
-
-public class Request implements PageWriter {
-
- public class RepeatMarker {
- private final int index;
-
- private RepeatMarker(final int index) {
- this.index = index;
- }
-
- public void repeat() {
- Request.this.index = index;
- }
- }
-
- private static Logger LOG = LoggerFactory.getLogger(Request.class);
- public static final boolean ENSURE_VARIABLES_EXIST = true;
- public static final boolean NO_VARIABLE_CHECKING = false;
- private static Encoder encoder;
-
- public static Encoder getEncoder() {
- return encoder;
- }
-
- private final RequestContext context;
- private final Stack<Snippet> snippets;
- private final Stack<StringBuffer> buffers;
- private final Stack<BlockContent> blocks;
- private final ProcessorLookup processors;
- private int nextFormId;
- private int index = -1;
- private final String path;
-
- public Request(final String path, final RequestContext context, final Encoder encoder, final Stack<Snippet> snippets, final ProcessorLookup processors) {
- this.path = path;
- this.context = context;
- Request.encoder = encoder;
- this.snippets = snippets;
- this.processors = processors;
-
- buffers = new Stack<StringBuffer>();
- blocks = new Stack<BlockContent>();
- pushNewBuffer();
- }
-
- public void processNextTag() {
- while (index < snippets.size() - 1) {
- index++;
- final Snippet snippet = snippets.get(index);
- if (snippet instanceof HtmlSnippet) {
- appendSnippet((HtmlSnippet) snippet);
- } else {
- final SwfTag tag = (SwfTag) snippet;
- final String name = tag.getName();
- final ElementProcessor processor = processors.getFor(name);
- process(tag, processor);
- if (context.isAborted()) {
- return;
- }
- }
- }
- }
-
- private void appendSnippet(final HtmlSnippet snippet) {
- String html = snippet.getHtml();
- try {
- if (snippet.isContainsVariable()) {
- html = context.replaceVariables(html);
- }
- appendHtml(html);
- } catch (final TagProcessingException e) {
- throw e;
- } catch (final RuntimeException e) {
- final String replace = "<";
- final String withReplacement = "<";
- html = html.replaceAll(replace, withReplacement);
-
- throw new TagProcessingException("Error while processing html block at " + snippet.errorAt() + " - " + e.getMessage(), html, e);
- }
- }
-
- @Override
- public void appendAsHtmlEncoded(final String string) {
- appendHtml(encodeHtml(string));
- // appendHtml(string);
- }
-
- @Override
- public void appendHtml(final String html) {
- final StringBuffer buffer = buffers.peek();
- buffer.append(html);
- }
-
- public void appendDebug(final String line) {
- context.appendDebugTrace(encodeHtml(line));
- }
-
- private String encodeHtml(final String text) {
- return encoder.encoder(text);
- }
-
- public void appendTruncated(String text, final int truncateTo) {
- if (truncateTo > 0 && text.length() > truncateTo) {
- text = text.substring(0, truncateTo) + "...";
- }
- appendAsHtmlEncoded(text);
- }
-
- private void process(final SwfTag tag, final ElementProcessor processor) {
- try {
- LOG.debug("processing " + processor.getName() + " " + tag);
- appendDebug("\n" + tag.debug());
- if (tag.getType() == SwfTag.END) {
- throw new TagProcessingException(tag.errorAt() + " - end tag mistaken for a start tag", tag.toString());
- }
- processor.process(this);
- } catch (final TagProcessingException e) {
- throw e;
- } catch (final RuntimeException e) {
- throw new TagProcessingException("Error while processing " + tag.getName().toLowerCase() + " element at " + tag.errorAt() + " - " + e.getMessage(), tag.toString(), e);
- }
- }
-
- public void processUtilCloseTag() {
- final SwfTag tag = getTag();
- if (tag.getType() == SwfTag.EMPTY) {
- return;
- }
- while (index < snippets.size() - 1) {
- index++;
- final Snippet snippet = snippets.get(index);
- if (snippet instanceof HtmlSnippet) {
- appendSnippet((HtmlSnippet) snippet);
- } else {
- final SwfTag nextTag = (SwfTag) snippet;
- if (tag.getName().equals(nextTag.getName())) {
- if (nextTag.getType() == SwfTag.START) {
- } else {
- return;
- }
- }
- final String name = nextTag.getName();
- if (nextTag.getType() == SwfTag.END && !tag.getName().equals(name)) {
- throw new TagProcessingException("Expected " + nextTag.getName().toLowerCase() + " tag but found " + tag.getName().toLowerCase() + " tag at " + nextTag.errorAt(), tag.toString());
- }
- final ElementProcessor processor = processors.getFor(name);
- process(nextTag, processor);
- }
- }
- }
-
- public void skipUntilClose() {
- final SwfTag tag = getTag();
- if (tag.getType() == SwfTag.EMPTY) {
- if (context.isDebug()) {
- appendHtml("<!-- " + "skipped " + tag + " -->");
- }
- return;
- }
- int depth = 1;
- while (index < snippets.size() - 1) {
- index++;
- final Snippet snippet = snippets.get(index);
- if (snippet instanceof SwfTag) {
- final SwfTag nextTag = (SwfTag) snippet;
- if (tag.getName().equals(nextTag.getName())) {
- if (nextTag.getType() == SwfTag.START) {
- depth++;
- } else {
- depth--;
- if (depth == 0) {
- return;
- }
- }
- }
- }
- }
- }
-
- public void closeEmpty() {
- final SwfTag tag = getTag();
- if (tag.getType() == SwfTag.EMPTY) {
- return;
- }
- if (index < snippets.size()) {
- final Snippet snippet = snippets.get(index);
- if (snippet instanceof SwfTag) {
- final SwfTag nextTag = (SwfTag) snippet;
- if (nextTag.getType() == SwfTag.EMPTY) {
- return;
- }
- }
- }
- throw new ScimpiException("Empty tag not closed");
- }
-
- public void pushNewBuffer() {
- final StringBuffer buffer = new StringBuffer();
- buffers.push(buffer);
- }
-
- public String popBuffer() {
- final String content = buffers.pop().toString();
- return content;
- }
-
- public SwfTag getTag() {
- return (SwfTag) snippets.get(index);
- }
-
- public RequestContext getContext() {
- return context;
- }
-
- // TODO rename to pushBlock()
- public void setBlockContent(final BlockContent content) {
- blocks.add(content);
- }
-
- public BlockContent popBlockContent() {
- return blocks.pop();
- }
-
- public BlockContent getBlockContent() {
- return blocks.peek();
- }
-
- public String getViewPath() {
- return path;
- }
-
- public String nextFormId() {
- return String.valueOf(nextFormId++);
- }
-
- public String getOptionalProperty(final String name, final String defaultValue) {
- return getOptionalProperty(name, defaultValue, true);
- }
-
- public String getOptionalProperty(final String name, final String defaultValue, final boolean ensureVariablesExists) {
- final Attributes attributes = getTag().getAttributes();
- return attributes.getOptionalProperty(name, defaultValue, ensureVariablesExists);
- }
-
- public String getOptionalProperty(final String name) {
- return getOptionalProperty(name, true);
- }
-
- public String getOptionalProperty(final String name, final boolean ensureVariablesExists) {
- final Attributes attributes = getTag().getAttributes();
- return attributes.getOptionalProperty(name, ensureVariablesExists);
- }
-
- public Attributes getAttributes() {
- return getTag().getAttributes();
- }
-
- public String getRequiredProperty(final String name) {
- return getRequiredProperty(name, true);
- }
-
- public String getRequiredProperty(final String name, final boolean ensureVariablesExists) {
- final Attributes attributes = getTag().getAttributes();
- return attributes.getRequiredProperty(name, ensureVariablesExists);
- }
-
- public boolean isRequested(final String name) {
- final Attributes attributes = getTag().getAttributes();
- return attributes.isRequested(name);
- }
-
- public boolean isRequested(final String name, final boolean defaultValue) {
- final Attributes attributes = getTag().getAttributes();
- return attributes.isRequested(name, defaultValue);
- }
-
- public boolean isPropertySet(final String name) {
- final Attributes attributes = getTag().getAttributes();
- return attributes.isPropertySet(name);
- }
-
- public boolean isPropertySpecified(final String name) {
- final Attributes attributes = getTag().getAttributes();
- return attributes.isPropertySpecified(name);
- }
-
- public RepeatMarker createMarker() {
- return new RepeatMarker(index);
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/SimpleEncoder.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/SimpleEncoder.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/SimpleEncoder.java
deleted file mode 100644
index 8b7a2d5..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/SimpleEncoder.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.processor;
-
-import org.apache.commons.lang.StringEscapeUtils;
-
-public class SimpleEncoder implements Encoder {
-
- @Override
- public String encoder(final String text) {
- return StringEscapeUtils.escapeHtml(text);
- // text.replace("&", "&").replaceAll("<", "<").replaceAll(">",
- // ">").replace("\"", """);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/TagProcessingException.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/TagProcessingException.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/TagProcessingException.java
deleted file mode 100644
index d9a8a60..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/processor/TagProcessingException.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.processor;
-
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-
-public class TagProcessingException extends ScimpiException {
- private static final long serialVersionUID = 1L;
- private String context;
-
- public TagProcessingException() {
- super();
- }
-
- public TagProcessingException(final String message, final String context, final Throwable cause) {
- super(message, cause);
- this.context = context;
- }
-
- public TagProcessingException(final String message, final String context) {
- super(message);
- this.context = context;
- }
-
- public TagProcessingException(final Throwable cause) {
- super(cause);
- }
-
- public String getContext() {
- return context;
- }
-
- @Override
- public String getMessage() {
- return super.getMessage() + "\n" + getContext();
- }
-
- @Override
- public String getHtmlMessage() {
- return super.getMessage() + "<pre>" + getContext() + "</pre>";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
deleted file mode 100644
index a6ae574..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.util;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.services.ServiceUtil;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.session.IsisSession;
-import org.apache.isis.viewer.scimpi.dispatcher.DispatchException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-
-public class MethodsUtils {
- public static final String SERVICE_PREFIX = "service:";
-
- public static Consent canRunMethod(final ObjectAdapter target, final ObjectAction action, final ObjectAdapter[] parameters) {
- final Consent consent = action.isProposedArgumentSetValid(target, parameters == null ? new ObjectAdapter[0] : parameters);
- return consent;
- }
-
- public static boolean runMethod(final RequestContext context, final ObjectAction action, final ObjectAdapter target, final ObjectAdapter[] parameters, String variable, Scope scope) {
- scope = scope == null ? Scope.REQUEST : scope;
- variable = variable == null ? RequestContext.RESULT : variable;
-
- final ObjectAdapter result = action.execute(target, parameters == null ? new ObjectAdapter[0] : parameters);
- if (result == null) {
- return false;
- } else {
- final String mappedId = context.mapObject(result, scope);
- context.addVariable(variable, mappedId, scope);
- // context.addVariable(variable + "_type",
- // action.getFacet(TypeOfFacet.class), scope);
- return true;
- }
- }
-
- public static boolean runMethod(final RequestContext context, final ObjectAction action, final ObjectAdapter target, final ObjectAdapter[] parameters) {
- return runMethod(context, action, target, parameters, null, null);
- }
-
- public static ObjectAction findAction(final ObjectAdapter object, final String methodName) {
- if (object == null) {
- throw new ScimpiException("Object not specified when looking for " + methodName);
- }
-
- final List<ObjectAction> actions = object.getSpecification().getObjectActions(Contributed.INCLUDED);
- final ObjectAction action = findAction(actions, methodName);
- /*
- * if (action == null) { actions =
- * object.getSpecification().getServiceActionsFor(ObjectActionType.USER,
- * ObjectActionType.EXPLORATION, ObjectActionType.DEBUG); action =
- * findAction(actions, methodName); }
- */
- if (action == null) {
- throw new DispatchException("Failed to find action " + methodName + " on " + object);
- }
- return action;
- }
-
- private static ObjectAction findAction(final List<ObjectAction> actions, final String methodName) {
- for (int i = 0; i < actions.size(); i++) {
- final ObjectAction objectAction = actions.get(i);
- if (objectAction.getId().equals(methodName)) {
- return objectAction;
- }
- }
- return null;
- }
-
- public static ObjectAdapter findObject(final RequestContext context, String objectId) {
- if (objectId == null) {
- objectId = context.getStringVariable(RequestContext.RESULT);
- }
-
- if (objectId != null && objectId.startsWith(SERVICE_PREFIX)) {
- final String serviceId = objectId.substring(SERVICE_PREFIX.length());
- final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
- for (final ObjectAdapter serviceAdapter : serviceAdapters) {
- final Object service = serviceAdapter.getObject();
- if (ServiceUtil.id(service).equals(serviceId.trim())) {
- final ObjectAdapter adapter = getAdapterManager().getAdapterFor(service);
- return adapter;
- }
- }
- throw new DispatchException("Failed to find service " + serviceId);
- } else {
- return context.getMappedObject(objectId);
- }
- }
-
- public static boolean isVisible(final ObjectAdapter object, final ObjectAction action, Where where) {
- return action.isVisible(getAuthenticationSession(), object, where).isAllowed();
- }
-
- public static String isUsable(final ObjectAdapter object, final ObjectAction action, Where where) {
- final Consent usable = action.isUsable(getAuthenticationSession(), object, where);
- final boolean isUsable = getSession() != null && usable.isAllowed();
- return isUsable ? null : usable.getReason();
- }
-
- public static boolean isVisibleAndUsable(final ObjectAdapter object, final ObjectAction action, Where where) {
- AuthenticationSession authenticatedSession = getAuthenticationSession();
- final boolean isVisible = action.isVisible(authenticatedSession, object, where).isAllowed();
- final boolean isUsable = getSession() != null && action.isUsable(authenticatedSession, object, where).isAllowed();
- final boolean isVisibleAndUsable = isVisible && isUsable;
- return isVisibleAndUsable;
- }
-
- private static AuthenticationSession getAuthenticationSession() {
- return IsisContext.getAuthenticationSession();
- }
-
- private static IsisSession getSession() {
- return IsisContext.getSession();
- }
-
- private static AdapterManager getAdapterManager() {
- return getPersistenceSession().getAdapterManager();
- }
-
- private static PersistenceSession getPersistenceSession() {
- return IsisContext.getPersistenceSession();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HelpLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HelpLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HelpLink.java
deleted file mode 100644
index 477828d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HelpLink.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.view;
-
-import org.apache.isis.core.commons.config.ConfigurationConstants;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class HelpLink extends AbstractElementProcessor {
-
- private static String site;
- private static String suffix;
-
- public static void append(final Request request, final String description, final String helpReference) {
- request.appendHtml(createHelpSegment(description, helpReference));
- }
-
- public static String createHelpSegment(final String description, final String helpReference) {
- if (site == null) {
- site = IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.help-site", "/help/");
- }
- if (suffix == null) {
- suffix = IsisContext.getConfiguration().getString(ConfigurationConstants.ROOT + "scimpi.help-suffix", "shtml");
- if (suffix == null || suffix.equals("")) {
- suffix = "";
- } else {
- suffix = "." + suffix;
- }
- }
-
- if (helpReference == null || helpReference.equals("No help available")) {
- return "";
- } else {
- final String elementClass = "help-link";
- final String link = site + helpReference + suffix;
- final String linkText = "Help";
- final String target = "scimpi-help";
- final String titleSection = description == null ? "" : ("\" title=\"" + description);
- return "<a class=\"" + elementClass + "\" href=\"" + link + "\" target=\"" + target + titleSection + "\"><img src=\"/images/help.png\" alt=\"" + linkText + "\" /></a>";
- }
- }
-
- @Override
- public String getName() {
- return "help";
- }
-
- @Override
- public void process(final Request request) {
- final String description = null;
- final String helpReference = request.getRequiredProperty("ref");
- append(request, description, helpReference);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/History.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/History.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/History.java
deleted file mode 100644
index 2f2a9b7..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/History.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.view;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-public class History extends AbstractElementProcessor {
-
- private static final String _HISTORY = "_history";
-
- static class Crumb {
- String name;
- String link;
- }
-
- static class Crumbs implements Serializable {
- private static final long serialVersionUID = 1L;
- private static final int MAXIMUM_SIZE = 10;
- private final List<Crumb> crumbs = new ArrayList<Crumb>();
-
- public void add(final String name, final String link) {
- for (final Crumb crumb : crumbs) {
- if (crumb.link.equals(link)) {
- crumbs.remove(crumb);
- crumbs.add(crumb);
- return;
- }
- }
-
- final Crumb crumb = new Crumb();
- crumb.name = name;
- crumb.link = link;
- crumbs.add(crumb);
-
- if (crumbs.size() > MAXIMUM_SIZE) {
- crumbs.remove(0);
- }
- }
-
- public void clear() {
- crumbs.clear();
- }
-
- public boolean isEmpty() {
- return crumbs.size() == 0;
- }
-
- public int size() {
- return crumbs.size();
- }
-
- public Iterable<Crumb> iterator() {
- return crumbs;
- }
-
- }
-
- @Override
- public String getName() {
- return "history";
- }
-
- @Override
- public void process(final Request request) {
- final String action = request.getOptionalProperty("action", "display");
- final Crumbs crumbs = getCrumbs(request);
- if (action.equals("display") && crumbs != null) {
- write(crumbs, request);
- } else if (action.equals("link")) {
- final String name = request.getRequiredProperty(NAME);
- final String link = request.getRequiredProperty(LINK_VIEW);
- crumbs.add(name, link);
- } else if (action.equals("object")) {
- final String id = request.getOptionalProperty(OBJECT);
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), id);
- final String name = object.titleString();
- String link = request.getRequiredProperty(LINK_VIEW);
- link += "?_result=" + id;
- crumbs.add(name, link);
- } else if (action.equals("return")) {
-
- } else if (action.equals("clear")) {
- crumbs.clear();
- }
-
- }
-
- public void write(final Crumbs crumbs, final Request request) {
- if (crumbs.isEmpty()) {
- return;
- }
-
- request.appendHtml("<div id=\"history\">");
- int i = 0;
- final int length = crumbs.size();
- for (final Crumb crumb : crumbs.iterator()) {
- final String link = crumb.link;
- if (i > 0) {
- request.appendHtml("<span class=\"separator\"> | </span>");
- }
- if (i == length - 1 || link == null) {
- request.appendHtml("<span class=\"disabled\">");
- request.appendHtml(crumb.name);
- request.appendHtml("</span>");
- } else {
- request.appendHtml("<a class=\"linked\" href=\"" + link + "\">");
- request.appendHtml(crumb.name);
- request.appendHtml("</a>");
- }
- i++;
- }
- request.appendHtml("</div>");
- }
-
- private Crumbs getCrumbs(final Request request) {
- final RequestContext context = request.getContext();
- Crumbs crumbs = (Crumbs) context.getVariable(_HISTORY);
- if (crumbs == null) {
- crumbs = new Crumbs();
- context.addVariable(_HISTORY, crumbs, Scope.SESSION);
- }
- return crumbs;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HtmlSnippet.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HtmlSnippet.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HtmlSnippet.java
deleted file mode 100644
index f1807df..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/HtmlSnippet.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view;
-
-public class HtmlSnippet implements Snippet {
- private final StringBuffer html = new StringBuffer();
- private boolean containsVariable;
- private final String lineNumbers;
- private final String path;
-
- public HtmlSnippet(final String lineNumbers, final String path) {
- this.lineNumbers = lineNumbers;
- this.path = path;
- }
-
- public void append(final String html) {
- this.html.append(html);
- containsVariable |= html.indexOf("${") >= 0;
- }
-
- @Override
- public String getHtml() {
- return html.toString();
- }
-
- public boolean isContainsVariable() {
- return containsVariable;
- }
-
- @Override
- public String errorAt() {
- return path + ":" + lineNumbers;
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/Snippet.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/Snippet.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/Snippet.java
deleted file mode 100644
index b8a7b3e..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/Snippet.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view;
-
-public interface Snippet {
-
- String getHtml();
-
- String errorAt();
-}
[37/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/cy2neo.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/cy2neo.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/cy2neo.js
new file mode 100644
index 0000000..4a23be8
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/cy2neo.js
@@ -0,0 +1,4 @@
+function Cy2Neo(config, graphId, sourceId, execId, urlSource) {
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/data.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/data.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/data.js
new file mode 100644
index 0000000..87d682c
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/data.js
@@ -0,0 +1,766 @@
+var graph = {
+ "nodes": [
+ {
+ "caption": "Screen Actors Guild Award for Outstanding Performance by a Female Actor in a Miniseries or Television Movie",
+ "type": "award",
+ "id": 595472
+ },
+ {
+ "caption": "Children of the Corn III: Urban Harvest",
+ "type": "movie",
+ "id": 626470
+ },
+ {
+ "caption": "Sleepwalking",
+ "type": "movie",
+ "id": 795744
+ },
+ {
+ "caption": "That Thing You Do!",
+ "type": "movie",
+ "id": 692946
+ },
+ {
+ "caption": "Trapped",
+ "type": "movie",
+ "id": 689794
+ },
+ {
+ "caption": "Head in the Clouds",
+ "type": "movie",
+ "id": 709577
+ },
+ {
+ "caption": "Waking Up in Reno",
+ "type": "movie",
+ "id": 635905
+ },
+ {
+ "caption": "Battle in Seattle",
+ "type": "movie",
+ "id": 734583
+ },
+ {
+ "caption": "Mighty Joe Young",
+ "type": "movie",
+ "id": 662595
+ },
+ {
+ "caption": "Academy Award for Actress in a Leading Role",
+ "type": "award",
+ "id": 593781
+ },
+ {
+ "caption": "The Devil's Advocate",
+ "type": "movie",
+ "id": 740763
+ },
+ {
+ "caption": "Screen Actors Guild Award for Outstanding Performance by a Cast in a Motion Picture",
+ "type": "award",
+ "id": 595440
+ },
+ {
+ "caption": "Silver Bear for Best Actress",
+ "type": "award",
+ "id": 601507
+ },
+ {
+ "caption": "The Curse of the Jade Scorpion",
+ "type": "movie",
+ "id": 649461
+ },
+ {
+ "caption": "MTV Movie Award for Best Female Performance",
+ "type": "award",
+ "id": 595074
+ },
+ {
+ "caption": "15 Minutes",
+ "type": "movie",
+ "id": 634248
+ },
+ {
+ "caption": "The Burning Plain",
+ "type": "movie",
+ "id": 670704
+ },
+ {
+ "caption": "The Life and Death of Peter Sellers",
+ "type": "movie",
+ "id": 794982
+ },
+ {
+ "caption": "Prometheus",
+ "type": "movie",
+ "id": 608746
+ },
+ {
+ "caption": "Teen Choice Award for Choice Summer Movie Star: Female",
+ "type": "award",
+ "id": 599909
+ },
+ {
+ "caption": "Chicago Film Critics Association Award for Best Actress",
+ "type": "award",
+ "id": 623686
+ },
+ {
+ "caption": "Golden Globe Award for Best Supporting Actress - Series, Miniseries or Television Film",
+ "type": "award",
+ "id": 598027
+ },
+ {
+ "caption": "Golden Globe Award for Best Actress - Musical or Comedy Film",
+ "type": "award",
+ "id": 595206
+ },
+ {
+ "caption": "Mad Max: Fury Road",
+ "type": "movie",
+ "id": 804341
+ },
+ {
+ "caption": "In the Valley of Elah",
+ "type": "movie",
+ "id": 621675
+ },
+ {
+ "caption": "Screen Actors Guild Award for Outstanding Performance by a Female Actor in a Leading Role",
+ "type": "award",
+ "id": 593954
+ },
+ {
+ "caption": "Golden Raspberry Award for Worst Actress",
+ "type": "award",
+ "id": 594134
+ },
+ {
+ "caption": "East of Havana",
+ "type": "movie",
+ "id": 609415
+ },
+ {
+ "caption": "The Road",
+ "type": "movie",
+ "id": 627715
+ },
+ {
+ "caption": "Golden Globe Award for Best Actress - Drama Film",
+ "type": "award",
+ "id": 593776
+ },
+ {
+ "caption": "Charles Jacobus Theron",
+ "type": "person",
+ "id": 314008
+ },
+ {
+ "caption": "Jackson Theron",
+ "type": "person",
+ "id": 314009
+ },
+ {
+ "caption": "Primetime Emmy Award for Outstanding Supporting Actress in a Miniseries or a Movie",
+ "type": "award",
+ "id": 595684
+ },
+ {
+ "caption": "The Cider House Rules",
+ "type": "movie",
+ "id": 801237
+ },
+ {
+ "caption": "The Astronaut's Wife",
+ "type": "movie",
+ "id": 657006
+ },
+ {
+ "caption": "Broadcast Film Critics Association Award for Best Actress",
+ "type": "award",
+ "id": 601849
+ },
+ {
+ "caption": "Hancock",
+ "type": "movie",
+ "id": 652245
+ },
+ {
+ "caption": "Charlize Theron",
+ "root": true,
+ "id": 314003
+ },
+ {
+ "caption": "Stuart Townsend",
+ "type": "person",
+ "id": 314004
+ },
+ {
+ "caption": "Stephan Jenkins",
+ "type": "person",
+ "id": 314005
+ },
+ {
+ "caption": "Benoni, Gauteng",
+ "type": "person",
+ "id": 314006
+ },
+ {
+ "caption": "Gerda Jacoba Aletta Maritz",
+ "type": "person",
+ "id": 314007
+ },
+ {
+ "caption": "Æon Flux",
+ "type": "movie",
+ "id": 663286
+ },
+ {
+ "caption": "Snow White and the Huntsman",
+ "type": "movie",
+ "id": 599907
+ },
+ {
+ "caption": "Young Adult",
+ "type": "movie",
+ "id": 661733
+ },
+ {
+ "caption": "Reindeer Games",
+ "type": "movie",
+ "id": 761000
+ },
+ {
+ "caption": "Monster",
+ "type": "movie",
+ "id": 729778
+ },
+ {
+ "caption": "The Legend of Bagger Vance",
+ "type": "movie",
+ "id": 804616
+ },
+ {
+ "caption": "Teen Choice Award for Choice Hissy Fit: Film",
+ "type": "award",
+ "id": 599908
+ },
+ {
+ "caption": "The Yards",
+ "type": "movie",
+ "id": 781638
+ },
+ {
+ "caption": "MTV Movie Award for Best Kiss",
+ "type": "award",
+ "id": 595095
+ },
+ {
+ "caption": "Celebrity",
+ "type": "movie",
+ "id": 611629
+ },
+ {
+ "caption": "Astro Boy",
+ "type": "movie",
+ "id": 818608
+ },
+ {
+ "caption": "North Country",
+ "type": "movie",
+ "id": 784437
+ },
+ {
+ "caption": "2 Days in the Valley",
+ "type": "movie",
+ "id": 615556
+ },
+ {
+ "caption": "Satellite Award for Best Actress – Motion Picture",
+ "type": "award",
+ "id": 595704
+ },
+ {
+ "caption": "Trial and Error",
+ "type": "movie",
+ "id": 799574
+ },
+ {
+ "caption": "National Society of Film Critics Award for Best Actress",
+ "type": "award",
+ "id": 595702
+ },
+ {
+ "caption": "Independent Spirit Award for Best Female Lead",
+ "type": "award",
+ "id": 595703
+ },
+ {
+ "caption": "Two Eyes Staring",
+ "type": "movie",
+ "id": 788889
+ },
+ {
+ "caption": "Sweet November",
+ "type": "movie",
+ "id": 811358
+ },
+ {
+ "caption": "Teen Choice Movie Award: Villain",
+ "type": "award",
+ "id": 595082
+ },
+ {
+ "caption": "Satellite Award for Best Supporting Actress – Drama",
+ "type": "award",
+ "id": 602151
+ },
+ {
+ "caption": "San Francisco Film Critics Circle Award for Best Actress",
+ "type": "award",
+ "id": 669827
+ },
+ {
+ "caption": "Independent Spirit Award for Best First Feature",
+ "type": "award",
+ "id": 599387
+ },
+ {
+ "caption": "The Italian Job",
+ "type": "movie",
+ "id": 817380
+ },
+ {
+ "caption": "Hollywood Confidential",
+ "type": "movie",
+ "id": 711550
+ },
+ {
+ "caption": "Men of Honor",
+ "type": "movie",
+ "id": 682763
+ },
+ {
+ "caption": "BAFTA Award for Best Actress in a Leading Role",
+ "type": "award",
+ "id": 594478
+ }
+ ],
+ "edges": [
+ {
+ "source": 314003,
+ "target": 621675,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 818608,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 601849,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 649461,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 669827,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 608746,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 593954,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 595702,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 601849,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 595095,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 729778,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 595703,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 811358,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 595472,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 661733,
+ "caption": "PRODUCED"
+ },
+ {
+ "source": 314003,
+ "target": 784437,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 634248,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 662595,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 804616,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 595703,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 626470,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 599387,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 599908,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 682763,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 595702,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 788889,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 657006,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 795744,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 593781,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 594478,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 594134,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 595074,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 692946,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 740763,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314005,
+ "target": 314003,
+ "caption": "PARTNER_OF"
+ },
+ {
+ "source": 314003,
+ "target": 711550,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 595440,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 801237,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 599907,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 761000,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 781638,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 670704,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 609415,
+ "caption": "PRODUCED"
+ },
+ {
+ "source": 314003,
+ "target": 314009,
+ "caption": "PARENT_OF"
+ },
+ {
+ "source": 314003,
+ "target": 652245,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 661733,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 602151,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 635905,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 799574,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 593781,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 817380,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 611629,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 729778,
+ "caption": "PRODUCED"
+ },
+ {
+ "source": 314003,
+ "target": 709577,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 804341,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 627715,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 794982,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 623686,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 595082,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 689794,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 788889,
+ "caption": "PRODUCED"
+ },
+ {
+ "source": 314007,
+ "target": 314003,
+ "caption": "PARENT_OF"
+ },
+ {
+ "source": 314003,
+ "target": 593776,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 734583,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 598027,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 601507,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 599909,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 314004,
+ "caption": "PARTNER_OF"
+ },
+ {
+ "source": 314003,
+ "target": 663286,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314003,
+ "target": 314006,
+ "caption": "BORN_AT"
+ },
+ {
+ "source": 314003,
+ "target": 615556,
+ "caption": "ACTED_IN"
+ },
+ {
+ "source": 314004,
+ "target": 314003,
+ "caption": "PARTNER_OF"
+ },
+ {
+ "source": 314008,
+ "target": 314003,
+ "caption": "PARENT_OF"
+ },
+ {
+ "source": 314003,
+ "target": 314005,
+ "caption": "PARTNER_OF"
+ },
+ {
+ "source": 314003,
+ "target": 795744,
+ "caption": "PRODUCED"
+ },
+ {
+ "source": 314003,
+ "target": 595704,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 670704,
+ "caption": "EXEC_PRODUCED"
+ },
+ {
+ "source": 314003,
+ "target": 593954,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 595206,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 593776,
+ "caption": "RECEIVED"
+ },
+ {
+ "source": 314003,
+ "target": 595704,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 595684,
+ "caption": "NOMINATED"
+ },
+ {
+ "source": 314003,
+ "target": 599387,
+ "caption": "NOMINATED"
+ }
+ ]
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/neo.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/neo.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/neo.js
new file mode 100644
index 0000000..651190a
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/neo.js
@@ -0,0 +1,73 @@
+function Neo(urlSource) {
+ function txUrl() {
+ var url = (urlSource() || "http://localhost:7474").replace(/\/db\/data.*/,"");
+ return url + "/db/data/cypher";
+ }
+ function getIdFromUrl(url){
+ var segments = url.split('/');
+ return segments[segments.length-1];
+ }
+ var me = {
+ executeQuery: function(query, params, cb) {
+ $.ajax(txUrl(), {
+ type: "POST",
+ data: JSON.stringify({
+ query : query,
+ params : params || {}
+ }),
+ contentType: "application/json",
+ error: function(err) {
+ cb(err);
+ },
+ success: function(res) {
+ if (res.exception) {
+ cb(res.exception);
+ } else {
+ var cols = res.columns;
+ var rows = res.data.map(function(row) {
+ var r = {};
+ cols.forEach(function(col, index) {
+ r[col] = row[index];
+ });
+ return r;
+ });
+ var nodes = [];
+ var rels = [];
+ var labels = [];
+ res.data.forEach(function(row) {
+
+ var node = row[0]['data'];
+
+ for (var property in node) {
+ if (Object.hasOwnProperty(property)) {
+ var found = nodes.filter(function (m) { return m.id == node.id; }).length > 0;
+ if (!found) {
+ nodes.push(node);
+ if (labels.indexOf(node.label) == -1) labels.push(node.label);
+ }
+ }
+ }
+
+ var rel = row[1];
+ if(rel){
+ rels = rels.concat({ source:getIdFromUrl(rel.start), target:getIdFromUrl(rel.end), caption:rel.type});
+ }
+ /*row.graph.nodes.forEach(function(n) {
+ var found = nodes.filter(function (m) { return m.id == n.id; }).length > 0;
+ if (!found) {
+ var node = n.properties||{}; node.id=n.id;node.type=n.labels[0];
+ nodes.push(node);
+ if (labels.indexOf(node.type) == -1) labels.push(node.type);
+ }
+ });*/
+
+ //rels = rels.concat(row.graph.relationships.map(function(r) { return { source:r.startNode, target:r.endNode, caption:r.type} }));
+ });
+ cb(null,{table:rows,graph:{nodes:nodes, edges:rels},labels:labels});
+ }
+ }
+ });
+ }
+ };
+ return me;
+}
[02/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
new file mode 100644
index 0000000..3321b87
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.*;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.edit.RemoveAction;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+public class RemoveElement extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final static Where where = Where.ANYWHERE;
+
+ @Override
+ public void process(final Request request) {
+ final String title = request.getOptionalProperty(BUTTON_TITLE, "Remove From List");
+ final String cls = request.getOptionalProperty(CLASS, "action in-line delete confirm");
+ final String object = request.getOptionalProperty(OBJECT);
+ final String resultOverride = request.getOptionalProperty(RESULT_OVERRIDE);
+ final RequestContext context = request.getContext();
+ final String objectId = object != null ? object : (String) context.getVariable(RequestContext.RESULT);
+ final ObjectAdapter adapter = MethodsUtils.findObject(context, objectId);
+
+ final String element = request.getOptionalProperty(ELEMENT, (String) context.getVariable(ELEMENT));
+ final ObjectAdapter elementId = MethodsUtils.findObject(context, element);
+
+ final String fieldName = request.getRequiredProperty(FIELD);
+
+ String view = request.getOptionalProperty(VIEW);
+ view = context.fullFilePath(view == null ? context.getResourceFile() : view);
+ String error = request.getOptionalProperty(ERROR);
+ error = context.fullFilePath(error == null ? context.getResourceFile() : error);
+
+ request.processUtilCloseTag();
+
+ write(request, adapter, fieldName, elementId, resultOverride, view, error, title, cls);
+ }
+
+ @Override
+ public String getName() {
+ return "remove-element";
+ }
+
+ public static void write(final Request request, final ObjectAdapter adapter, final String fieldName, final ObjectAdapter element, final String resultOverride, final String view, final String error, final String title, final String cssClass) {
+ final ObjectAssociation field = adapter.getSpecification().getAssociation(fieldName);
+ if (field == null) {
+ throw new ScimpiException("No field " + fieldName + " in " + adapter.getSpecification().getFullIdentifier());
+ }
+ if (!field.isOneToManyAssociation()) {
+ throw new ScimpiException("Field " + fieldName + " not a collection, in " + adapter.getSpecification().getFullIdentifier());
+ }
+ if (field.isVisible(IsisContext.getAuthenticationSession(), adapter, where).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+ ResolveFieldUtil.resolveField(adapter, field);
+
+ Consent usable = field.isUsable(IsisContext.getAuthenticationSession(), adapter, where);
+ if (usable.isAllowed()) {
+ usable = ((OneToManyAssociation) field).isValidToRemove(adapter, element);
+ }
+
+ if (usable.isVetoed()) {
+ request.appendHtml("<div class=\"" + cssClass + " disabled-form\">");
+ request.appendHtml("<div class=\"button disabled\" title=\"");
+ request.appendAsHtmlEncoded(usable.getReason());
+ request.appendHtml("\" >" + title);
+ request.appendHtml("</div>");
+ request.appendHtml("</div>");
+ } else {
+ if (valid(request, adapter)) {
+ final String classSegment = " class=\"" + cssClass + "\"";
+
+ final String objectId = request.getContext().mapObject(adapter, Scope.INTERACTION);
+ final String elementId = request.getContext().mapObject(element, Scope.INTERACTION);
+ final String action = RemoveAction.ACTION + Dispatcher.COMMAND_ROOT;
+ request.appendHtml("<form" + classSegment + " method=\"post\" action=\"" + action + "\" >");
+ request.appendHtml("<input type=\"hidden\" name=\"" + OBJECT + "\" value=\"" + objectId + "\" />");
+ request.appendHtml("<input type=\"hidden\" name=\"" + FIELD + "\" value=\"" + fieldName + "\" />");
+ request.appendHtml("<input type=\"hidden\" name=\"" + ELEMENT + "\" value=\"" + elementId + "\" />");
+ if (resultOverride != null) {
+ request.appendHtml("<input type=\"hidden\" name=\"" + RESULT_OVERRIDE + "\" value=\"" + resultOverride + "\" />");
+ }
+ request.appendHtml("<input type=\"hidden\" name=\"" + VIEW + "\" value=\"" + view + "\" />");
+ request.appendHtml("<input type=\"hidden\" name=\"" + ERROR + "\" value=\"" + error + "\" />");
+ request.appendHtml(request.getContext().interactionFields());
+ request.appendHtml("<input class=\"button\" type=\"submit\" value=\"" + title + "\" />");
+ request.appendHtml("</form>");
+ }
+ }
+ }
+
+ private static boolean valid(final Request request, final ObjectAdapter adapter) {
+ // TODO is this check valid/necessary?
+
+ // TODO check is valid to remove element
+ final AuthenticationSession session = IsisContext.getAuthenticationSession();
+ final Filter<ObjectAssociation> filter = ObjectAssociation.Filters.dynamicallyVisible(session, adapter, where);
+ final List<ObjectAssociation> visibleFields = adapter.getSpecification().getAssociations(Contributed.EXCLUDED, filter);
+ if (visibleFields.size() == 0) {
+ return false;
+ }
+
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ScopeTag.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ScopeTag.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ScopeTag.java
new file mode 100644
index 0000000..2dced50
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ScopeTag.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class ScopeTag extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String name = request.getRequiredProperty(NAME);
+ final String scopeName = request.getRequiredProperty(SCOPE);
+ final Scope scope = RequestContext.scope(scopeName);
+ request.processUtilCloseTag();
+ changeScope(request, name, scope);
+ }
+
+ protected static void changeScope(final Request request, final String name, final Scope scope) {
+ request.getContext().changeScope(name, scope);
+ final Object value = request.getContext().getVariable(name);
+ if (value != null) {
+ request.getContext().addVariable(name, value, scope);
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "scope";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookie.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookie.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookie.java
new file mode 100644
index 0000000..1014280
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookie.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.action.RequiredPropertyException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class SetCookie extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String name = request.getRequiredProperty("name");
+ final String value = request.getOptionalProperty("value");
+ final boolean isClear = request.getOptionalProperty("action", "set").equals("clear");
+ final String expiresString = request.getOptionalProperty("expires", "-1");
+
+ if (!isClear && value == null) {
+ throw new RequiredPropertyException("Property not set: " + value);
+ }
+ if (isClear) {
+ request.appendDebug("cookie: " + name + " (cleared)");
+ request.getContext().addCookie(name, null, 0);
+ } else {
+ if (value.length() > 0) {
+ request.appendDebug("cookie: " + name + " set to"+ value);
+ request.getContext().addCookie(name, value, Integer.valueOf(expiresString));
+ }
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "set-cookie";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookieFromField.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookieFromField.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookieFromField.java
new file mode 100644
index 0000000..b91261c
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetCookieFromField.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class SetCookieFromField extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ throw new NotYetImplementedException("3.1");
+ /*
+ * String objectId = request.getOptionalProperty(OBJECT); String
+ * fieldName = request.getRequiredProperty(FIELD);
+ *
+ * ObjectAdapter object = (ObjectAdapter)
+ * request.getContext().getMappedObjectOrResult(objectId);
+ * ObjectAssociation field =
+ * object.getSpecification().getField(fieldName); if (field.isValue()) {
+ * throw new ScimpiException("Can only set up a value field"); }
+ * ObjectAdapter value = field.get(object); if (value != null) { String
+ * title = value.titleString();
+ *
+ * if (title.length() > 0) { String name =
+ * request.getRequiredProperty(NAME); String expiresString =
+ * request.getOptionalProperty("expires", "-1");
+ * request.getContext().addCookie(name, title,
+ * Integer.valueOf(expiresString)); } }
+ */
+ }
+
+ @Override
+ public String getName() {
+ return "set-cookie-from-field";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetFieldFromCookie.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetFieldFromCookie.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetFieldFromCookie.java
new file mode 100644
index 0000000..89702fa
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetFieldFromCookie.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class SetFieldFromCookie extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ throw new NotYetImplementedException("3.1");
+ /*
+ * String name = request.getRequiredProperty(NAME); String cookieString
+ * = request.getContext().getCookie(name); ObjectAdapter valueAdapter =
+ * IsisContext.getObjectPersistor().createAdapterForValue(cookieString);
+ *
+ * String objectId = request.getOptionalProperty(OBJECT); String
+ * fieldName = request.getRequiredProperty(FIELD); ObjectAdapter object
+ * = (ObjectAdapter)
+ * request.getContext().getMappedObjectOrResult(objectId);
+ * ObjectAssociation field =
+ * object.getSpecification().getField(fieldName); if (field.isValue()) {
+ * throw new ScimpiException("Can only set up a value field"); }
+ *
+ * ((ValueAssociation) field).setValue(object, valueAdapter);
+ */
+ }
+
+ @Override
+ public String getName() {
+ return "set-field-from-cookie";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetLocalization.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetLocalization.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetLocalization.java
new file mode 100644
index 0000000..d8f79f6
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SetLocalization.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import java.util.Locale;
+import java.util.TimeZone;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+/**
+ * Displays the localization data for the current user.
+ */
+public class SetLocalization extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ request.closeEmpty();
+
+ final String localeCode = request.getRequiredProperty("locale");
+ final String timeZone = request.getRequiredProperty("time-zone");
+
+ String country;
+ String language;
+ int pos = localeCode.indexOf('_');
+ if (pos == 1) {
+ language = localeCode;
+ country = "";
+ } else {
+ language = localeCode.substring(0, pos);
+ country = localeCode.substring(pos + 1);
+ }
+
+ Locale l = new Locale(language, country);
+ TimeZone t = TimeZone.getTimeZone(timeZone);
+ // IsisContext.getUserProfile().setLocalization(new UserLocalization(l, t));
+
+ }
+
+ @Override
+ public String getName() {
+ return "alpha-set-localization";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SimpleButton.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SimpleButton.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SimpleButton.java
new file mode 100644
index 0000000..1efd7bf
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/SimpleButton.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class SimpleButton extends AbstractElementProcessor {
+ @Override
+ public void process(final Request request) {
+ final String href = request.getRequiredProperty("href");
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ final String text = request.popBuffer();
+ request.appendHtml("<div class=\"action\"><a class=\"button\" href=\"" + href + "\">" + text + "</a></div>");
+ }
+
+ @Override
+ public String getName() {
+ return "button";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/StartSession.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/StartSession.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/StartSession.java
new file mode 100644
index 0000000..493c33a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/StartSession.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class StartSession extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ request.getContext().startHttpSession();
+ }
+
+ @Override
+ public String getName() {
+ return "start-session";
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/TemplateTag.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/TemplateTag.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/TemplateTag.java
new file mode 100644
index 0000000..8860780
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/TemplateTag.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class TemplateTag implements ElementProcessor {
+
+ @Override
+ public String getName() {
+ return "template";
+ }
+
+ @Override
+ public void process(final Request request) {
+ // REVIEW this make IE8 render poorly as the browser doesn't think a
+ // DOCTYPE is provided, causing it to run in
+ // quirk mode
+ // request.appendHtml("<!-- zz apply template " +
+ // request.getOptionalProperty("file") + " -->");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Unless.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Unless.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Unless.java
new file mode 100644
index 0000000..9dcf810
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Unless.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Unless extends AbstractConditionalBlock {
+
+ @Override
+ protected void processTags(final boolean isSet, final Request request) {
+ if (isSet) {
+ request.skipUntilClose();
+ request.appendDebug(" skipping segment");
+ } else {
+ request.processUtilCloseTag();
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "unless";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Variable.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Variable.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Variable.java
new file mode 100644
index 0000000..960fc6b
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Variable.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Variable extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String name = request.getOptionalProperty(NAME);
+ final String value = request.getOptionalProperty(VALUE);
+ final String defaultTo = request.getOptionalProperty(DEFAULT);
+ final String scopeName = request.getOptionalProperty(SCOPE);
+ final boolean isClear = request.getOptionalProperty("action", "set").equals("clear");
+ final Scope scope = RequestContext.scope(scopeName, isClear ? Scope.SESSION : Scope.REQUEST);
+ process(request, name, value, defaultTo, isClear, scope);
+ }
+
+ protected void process(final Request request, final String name, final String value, final String defaultTo, final boolean isClear, final Scope scope) {
+ request.pushNewBuffer();
+ request.processUtilCloseTag();
+ String source = request.popBuffer();
+ if (isClear) {
+ request.appendDebug("variable: " + name + " (cleared)");
+ request.getContext().clearVariable(name, scope);
+ } else {
+ if (source.length() == 0 && value != null) {
+ source = value;
+ }
+ if (source.length() == 0) {
+ source = defaultTo;
+ }
+ request.appendDebug(" " + name + " (" + scope + ") set to " + source);
+ request.getContext().addVariable(name, source, scope);
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "variable";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/When.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/When.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/When.java
new file mode 100644
index 0000000..cc1fd09
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/When.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
+
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class When extends AbstractConditionalBlock {
+
+ @Override
+ protected void processTags(final boolean isSet, final Request request) {
+ if (isSet) {
+ request.processUtilCloseTag();
+ } else {
+ request.appendDebug(" skipping segment");
+ request.skipUntilClose();
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "when";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ActionName.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ActionName.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ActionName.java
new file mode 100644
index 0000000..119a453
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ActionName.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.value;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+// TODO do the same for description and help, and for fields
+public class ActionName extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String objectId = request.getOptionalProperty(OBJECT);
+ final String methodName = request.getRequiredProperty(METHOD);
+
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
+ final ObjectAction action = MethodsUtils.findAction(object, methodName);
+
+ request.appendAsHtmlEncoded(action.getName());
+ }
+
+ @Override
+ public String getName() {
+ return "action-name";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/CountElements.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/CountElements.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/CountElements.java
new file mode 100644
index 0000000..debaa49
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/CountElements.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.value;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class CountElements extends AbstractObjectProcessor {
+
+ @Override
+ protected void process(final Request request, final ObjectAdapter collection) {
+ final CollectionFacet facet = collection.getSpecification().getFacet(CollectionFacet.class);
+ final int size = facet.size(collection);
+ if (size == 0) {
+ request.appendHtml(request.getOptionalProperty("none", "0"));
+ } else if (size == 1) {
+ request.appendHtml(request.getOptionalProperty("one", "1"));
+ } else {
+ final String text = request.getOptionalProperty("many", "" + size);
+ request.appendHtml(String.format(text, size));
+ }
+ }
+
+ @Override
+ protected String checkFieldType(final ObjectAssociation objectField) {
+ return objectField.isOneToManyAssociation() ? null : "must be a collection";
+ }
+
+ @Override
+ public String getName() {
+ return "count";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ElementType.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ElementType.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ElementType.java
new file mode 100644
index 0000000..c7284a0
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ElementType.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.value;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class ElementType extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ ObjectAdapter collection;
+ final String field = request.getOptionalProperty(FIELD);
+ final RequestContext context = request.getContext();
+ if (field != null) {
+ final String id = request.getRequiredProperty(OBJECT);
+ final ObjectAdapter object = context.getMappedObjectOrResult(id);
+ final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
+ if (!objectField.isOneToManyAssociation()) {
+ throw new ScimpiException("Field " + objectField.getId() + " is not a collection");
+ }
+ collection = objectField.get(object);
+ } else {
+ final String id = request.getOptionalProperty(COLLECTION);
+ collection = context.getMappedObjectOrResult(id);
+ }
+
+ final ObjectSpecification elementSpecification = collection.getElementSpecification();
+ final String name = elementSpecification.getSingularName();
+
+ request.appendAsHtmlEncoded(name);
+ }
+
+ @Override
+ public String getName() {
+ return "element-type";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/FieldName.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/FieldName.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/FieldName.java
new file mode 100644
index 0000000..ed054a1
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/FieldName.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.value;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class FieldName extends AbstractElementProcessor {
+
+ // REVIEW: should provide this rendering context, rather than hardcoding.
+ // the net effect currently is that class members annotated with
+ // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
+ // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
+ // for any other value for Where
+ private final Where where = Where.ANYWHERE;
+
+ @Override
+ public void process(final Request request) {
+ final String id = request.getOptionalProperty(OBJECT);
+ final String fieldName = request.getRequiredProperty(FIELD);
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
+ if (field == null) {
+ throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier());
+ }
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+ request.appendAsHtmlEncoded(field.getName());
+ }
+
+ @Override
+ public String getName() {
+ return "field-name";
+ }
+
+ public static void write(final Request content, final ObjectAssociation field) {
+ content.appendHtml("<span class=\"label\" title=\"" + field.getDescription() + "\">");
+ content.appendHtml("</span>");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ParameterName.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ParameterName.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ParameterName.java
new file mode 100644
index 0000000..84e2204
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/ParameterName.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.value;
+
+import java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
+
+public class ParameterName extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String objectId = request.getOptionalProperty(OBJECT);
+ final String methodName = request.getRequiredProperty(METHOD);
+ final String field = request.getOptionalProperty(PARAMETER_NUMBER);
+
+ final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), objectId);
+ final ObjectAction action = MethodsUtils.findAction(object, methodName);
+ final List<ObjectActionParameter> parameters = action.getParameters();
+
+ int index;
+ if (field == null) {
+ index = 0;
+ } else {
+ index = Integer.valueOf(field).intValue() - 1;
+ }
+ if (index < 0 || index >= parameters.size()) {
+ throw new ScimpiException("Parameter numbers should be between 1 and " + parameters.size() + ": " + index);
+ }
+
+ request.appendAsHtmlEncoded(parameters.get(index).getName());
+ }
+
+ @Override
+ public String getName() {
+ return "parameter-name";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/TitleString.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/TitleString.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/TitleString.java
new file mode 100644
index 0000000..6b2078a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/TitleString.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.value;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+/**
+ *
+ */
+public class TitleString extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final String id = request.getOptionalProperty(OBJECT);
+ final String fieldName = request.getOptionalProperty(FIELD);
+ final int truncateTo = Integer.valueOf(request.getOptionalProperty(TRUNCATE, "0")).intValue();
+ final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id);
+ if (object == null) {
+ return;
+ }
+ String titleString;
+ if (fieldName == null) {
+ titleString = object.titleString();
+ } else {
+ final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
+ if (field.isVisible(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE).isVetoed()) {
+ throw new ForbiddenException(field, ForbiddenException.VISIBLE);
+ }
+ final ObjectAdapter fieldReference = field.get(object);
+ if (fieldReference != null) {
+ titleString = fieldReference.titleString();
+ } else {
+ titleString = "";
+ }
+ }
+ request.appendDebug(" " + titleString);
+ request.appendTruncated(titleString, truncateTo);
+ }
+
+ @Override
+ public String getName() {
+ return "title-string";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/Type.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/Type.java b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/Type.java
new file mode 100644
index 0000000..9c7861d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/value/Type.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.dispatcher.view.value;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
+import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
+
+public class Type extends AbstractElementProcessor {
+
+ @Override
+ public void process(final Request request) {
+ final RequestContext context = request.getContext();
+ final String showPlural = request.getOptionalProperty(PLURAL);
+ final String id = request.getOptionalProperty(OBJECT);
+ final String objectId = id != null ? id : (String) context.getVariable(RequestContext.RESULT);
+
+ ObjectAdapter object = context.getMappedObjectOrResult(objectId);
+ final String field = request.getOptionalProperty(FIELD);
+ if (field != null) {
+ final ObjectAssociation objectField = object.getSpecification().getAssociation(field);
+ object = objectField.get(object);
+ }
+ request.appendDebug(" for " + object);
+
+ final ObjectSpecification specification = object.getSpecification();
+ final String name = showPlural != null ? specification.getPluralName() : specification.getSingularName();
+
+ request.appendAsHtmlEncoded(name);
+ }
+
+ @Override
+ public String getName() {
+ return "type";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/pom.xml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/pom.xml b/mothballed/component/viewer/scimpi/pom.xml
new file mode 100644
index 0000000..300d60d
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/pom.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<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>
+
+ <parent>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis</artifactId>
+ <version>1.9.0-SNAPSHOT</version>
+ <relativePath>../../../core/pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-scimpi</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+
+ <name>Isis Scimpi Viewer</name>
+
+ <packaging>pom</packaging>
+
+ <properties>
+ <siteBaseDir>.</siteBaseDir>
+ <relativeUrl/>
+ </properties>
+
+ <!-- used in Site generation for relative references. -->
+ <url>http://isis.apache.org/${relativeUrl}</url>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <!-- Apache Release Audit Tool -->
+ <plugin>
+ <groupId>org.apache.rat</groupId>
+ <artifactId>apache-rat-plugin</artifactId>
+ <version>0.10</version>
+ <configuration>
+ <excludes>
+ <!--
+ overriding inherited excludes from oia.core:isis
+ with a more specific set for this component
+ -->
+ <exclude>**/target/**</exclude>
+ <exclude>**/target-ide/**</exclude>
+
+ <exclude>**/*.project</exclude>
+ <exclude>**/.classpath</exclude>
+ <exclude>**/.settings/**</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-project-info-reports-plugin</artifactId>
+ <inherited>false</inherited>
+ <reportSets>
+ <reportSet>
+ <inherited>false</inherited>
+ <reports>
+ <report>dependency-management</report>
+ <report>plugins</report>
+ <report>modules</report>
+ <report>summary</report>
+ </reports>
+ </reportSet>
+ </reportSets>
+ </plugin>
+ </plugins>
+ </reporting>
+
+ <dependencyManagement>
+ <dependencies>
+
+ <!-- for benefit of application developers, using scope=import -->
+
+ <dependency>
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-scimpi-dispatcher</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-scimpi-servlet</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <!-- defined here because other Isis modules do not depend upon it -->
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <version>20140107</version>
+ </dependency>
+
+ </dependencies>
+ </dependencyManagement>
+
+ <modules>
+ <module>dispatcher</module>
+ <module>servlet</module>
+ </modules>
+</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/servlet/pom.xml
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/servlet/pom.xml b/mothballed/component/viewer/scimpi/servlet/pom.xml
new file mode 100644
index 0000000..1600dd7
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/servlet/pom.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-scimpi</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>isis-viewer-scimpi-servlet</artifactId>
+
+ <name>Isis Scimpi Viewer Servlet</name>
+
+ <properties>
+ <siteBaseDir>..</siteBaseDir>
+ <relativeUrl>servlet/</relativeUrl>
+ </properties>
+
+ <!-- used in Site generation for relative references. -->
+ <url>http://isis.apache.org/${relativeUrl}</url>
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-project-info-reports-plugin</artifactId>
+ <inherited>false</inherited>
+ <configuration>
+ <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+ </configuration>
+ <reportSets>
+ <reportSet>
+ <inherited>false</inherited>
+ <reports>
+ <report>dependencies</report>
+ <report>dependency-convergence</report>
+ <report>plugins</report>
+ <report>summary</report>
+ </reports>
+ </reportSet>
+ </reportSets>
+ </plugin>
+ </plugins>
+ </reporting>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.isis.viewer</groupId>
+ <artifactId>isis-viewer-scimpi-dispatcher</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-servlet_3.0_spec</artifactId>
+ </dependency>
+
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatchException.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatchException.java b/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatchException.java
new file mode 100644
index 0000000..6bb776c
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatchException.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.servlet;
+
+import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+
+public class DispatchException extends ScimpiException {
+ private static final long serialVersionUID = 1L;
+
+ public DispatchException() {
+ }
+
+ public DispatchException(final String message) {
+ super(message);
+ }
+
+ public DispatchException(final Throwable cause) {
+ super(cause);
+ }
+
+ public DispatchException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatcherServlet.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatcherServlet.java b/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatcherServlet.java
new file mode 100644
index 0000000..272e1c4
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/DispatcherServlet.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.servlet;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
+import org.apache.isis.viewer.scimpi.dispatcher.UserManager;
+import org.apache.isis.viewer.scimpi.dispatcher.debug.DebugUsers;
+
+public class DispatcherServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+ private static final Logger LOG = LoggerFactory.getLogger(DispatcherServlet.class);
+ private Dispatcher dispatcher;
+ private DebugUsers debugUsers;
+
+ @Override
+ protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
+ LOG.info("http request from " + request.getRemoteAddr() + ": post " + request.getServletPath() + "?" + request.getQueryString());
+ process(request, response);
+ }
+
+ @Override
+ protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
+ LOG.info("http request from " + request.getRemoteAddr() + ": get " + request.getServletPath() + "?" + request.getQueryString());
+ process(request, response);
+ }
+
+ private void process(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
+ try {
+ final ServletRequestContext context = new ServletRequestContext(debugUsers);
+ context.startRequest(request, response, getServletContext());
+ dispatcher.process(context, request.getServletPath());
+ } catch (final RuntimeException e) {
+ LOG.error("servlet exception", e);
+ throw e;
+ }
+ }
+
+ @Override
+ public void init() throws ServletException {
+ super.init();
+
+ // TODO get directory from servlet parameter
+ ImageLookup.setImageDirectory(getServletContext(), "images");
+
+ debugUsers = new DebugUsers();
+ debugUsers.initialize();
+
+ dispatcher = new Dispatcher();
+ final Enumeration initParameterNames = getInitParameterNames();
+ while (initParameterNames.hasMoreElements()) {
+ final String name = (String) initParameterNames.nextElement();
+ final String value = getInitParameter(name);
+ dispatcher.addParameter(name, value);
+ }
+ final String dir = getServletContext().getRealPath("/WEB-INF");
+ dispatcher.init(dir, debugUsers);
+
+ new UserManager(IsisContext.getAuthenticationManager());
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ImageLookup.java
----------------------------------------------------------------------
diff --git a/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ImageLookup.java b/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ImageLookup.java
new file mode 100644
index 0000000..39a703a
--- /dev/null
+++ b/mothballed/component/viewer/scimpi/servlet/src/main/java/org/apache/isis/viewer/scimpi/servlet/ImageLookup.java
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.scimpi.servlet;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.ServletContext;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+/**
+ * ImageLookup provides an efficient way of finding the most suitable image to
+ * use. It ensures that an image is always available, providing a default image
+ * if needed. All requests are cached to improve performance.
+ */
+// TODO allow for multiple extension types
+public class ImageLookup {
+ private static final Logger LOG = LoggerFactory.getLogger(ImageLookup.class);
+ private static final String UNKNOWN_IMAGE = "Default";
+ private static final String[] EXTENSIONS = { "png", "gif", "jpg", "jpeg" };
+ private static final Map images = new HashMap();
+ private static String imageDirectory;
+ // private static String unknownImageFile;
+ private static ServletContext context;
+
+ public static void setImageDirectory(final ServletContext context, String imageDirectory) {
+ LOG.debug("image directory required for: " + imageDirectory);
+ ImageLookup.context = context;
+ imageDirectory = (imageDirectory.startsWith("/") ? "" : "/") + imageDirectory + "/";
+ final Set resourcePaths = context.getResourcePaths(imageDirectory);
+ if (resourcePaths == null || resourcePaths.size() == 0) {
+ //throw new IsisException("No image directory found: " + imageDirectory);
+ LOG.warn("No image directory found: " + imageDirectory);
+ }
+ LOG.info("image directory set to: " + imageDirectory);
+ ImageLookup.imageDirectory = imageDirectory;
+ }
+
+ public static void debug(final DebugString debug) {
+ debug.appendTitle("Image Lookup");
+ debug.indent();
+ final Iterator keys = images.keySet().iterator();
+ while (keys.hasNext()) {
+ final Object key = keys.next();
+ final Object value = images.get(key);
+ debug.appendln(key + " -> " + value);
+ }
+ debug.unindent();
+ }
+
+ private static String imageFile(final String imageName, final String contextPath) {
+ for (final String element : EXTENSIONS) {
+ URL resource;
+ try {
+ final String imagePath = imageDirectory + imageName + "." + element;
+ resource = context.getResource(imagePath);
+ if (resource != null) {
+ LOG.debug("image found at " + contextPath + imagePath);
+ return contextPath + imagePath;
+ }
+ final URL onClasspath = ImageLookup.class.getResource(imagePath);
+ if (onClasspath != null) {
+ LOG.debug("image found on classpath " + onClasspath);
+ return contextPath + imagePath;
+ }
+ } catch (final MalformedURLException ignore) {
+ }
+ }
+ return null;
+ }
+
+ private static String findImage(final ObjectSpecification specification, final String contextPath) {
+ String path = findImageFor(specification, contextPath);
+ if (path == null) {
+ path = imageFile(UNKNOWN_IMAGE, contextPath);
+ }
+ return path;
+ }
+
+ private static String findImageFor(final ObjectSpecification specification, final String contextPath) {
+ final String name = specification.getShortIdentifier();
+ final String fileName = imageFile(name, contextPath);
+ if (fileName != null) {
+ images.put(name, fileName);
+ return fileName;
+ } else {
+ for (final ObjectSpecification interfaceSpec : specification.interfaces()) {
+ final String path = findImageFor(interfaceSpec, contextPath);
+ if (path != null) {
+ return path;
+ }
+ }
+ final ObjectSpecification superclass = specification.superclass();
+ if (superclass != null) {
+ return findImageFor(superclass, contextPath);
+ } else {
+ return null;
+ }
+ }
+ }
+
+ /**
+ * For an object, the icon name from the object is return if it is not null,
+ * otherwise the specification is used to look up a suitable image name.
+ *
+ * @param contextPath
+ *
+ * @see ObjectAdapter#getIconName()
+ * @see #imagePath(ObjectSpecification)
+ */
+ /*
+ * public static String imagePath(ObjectAdapter object) { String iconName =
+ * object.getIconName(); if (iconName != null) { return imagePath(iconName);
+ * } else { return imagePath(object.getSpecification()); } }
+ */
+ public static String imagePath(final ObjectSpecification specification, final String contextPath) {
+ final String name = specification.getShortIdentifier();
+ final String imageName = (String) images.get(name);
+ if (imageName != null) {
+ return imageName;
+ } else {
+ return findImage(specification, contextPath);
+ }
+ }
+
+ /*
+ * public static String imagePath(String name) { String imageName = (String)
+ * images.get(name); if (imageName != null) { return (String) imageName; }
+ * else { String fileName = imageFile(name); return fileName == null ?
+ * unknownImageFile : fileName; } }
+ */
+
+ public static String imagePath(final ObjectAdapter object, final String contextPath) {
+ final String name = object.getIconName();
+ final String imageName = (String) images.get(name);
+ if (imageName != null) {
+ return imageName;
+ } else {
+ final String imageFile = imageFile(name, contextPath);
+ if (imageFile != null) {
+ return imageFile;
+ } else {
+ return findImage(object.getSpecification(), contextPath);
+ }
+ }
+ }
+}
[14/59] [abbrv] isis git commit: ISIS-720: mothballing scimpi
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logon.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logon.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logon.java
deleted file mode 100644
index facd79d..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Logon.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.isis.core.commons.authentication.AnonymousSession;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FieldEditState;
-import org.apache.isis.viewer.scimpi.dispatcher.edit.FormState;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.HiddenInputField;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.HtmlFormBuilder;
-import org.apache.isis.viewer.scimpi.dispatcher.view.form.InputField;
-
-public class Logon extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- String view = request.getOptionalProperty(VIEW);
- RequestContext context = request.getContext();
- if (view == null) {
- view = (String) context.getVariable("login-path");
- }
-
- final boolean isNotLoggedIn = IsisContext.getSession().getAuthenticationSession() instanceof AnonymousSession;
- if (isNotLoggedIn) {
- loginForm(request, view);
- }
- }
-
- public static void loginForm(final Request request, final String view) {
- final String object = request.getOptionalProperty(OBJECT);
- final String method = request.getOptionalProperty(METHOD, "logon");
- final String result = request.getOptionalProperty(RESULT_NAME, "_user");
- final String resultScope = request.getOptionalProperty(SCOPE, Scope.SESSION.name());
- final String role = request.getOptionalProperty("field", "roles");
-// final String isisUser = request.getOptionalProperty("isis-user", "_web_default");
- final String formId = request.getOptionalProperty(FORM_ID, request.nextFormId());
- final String labelDelimiter = request.getOptionalProperty(LABEL_DELIMITER, ":");
-
- // TODO error if all values are not set (not if use type is not set and all others are still defaults);
-
- if (object != null) {
- RequestContext context = request.getContext();
- context.addVariable(LOGON_OBJECT, object, Scope.SESSION);
- context.addVariable(LOGON_METHOD, method, Scope.SESSION);
- context.addVariable(LOGON_RESULT_NAME, result, Scope.SESSION);
- context.addVariable(LOGON_SCOPE, resultScope, Scope.SESSION);
- context.addVariable(PREFIX + "roles-field", role, Scope.SESSION);
-// context.addVariable(PREFIX + "isis-user", isisUser, Scope.SESSION);
- context.addVariable(LOGON_FORM_ID, formId, Scope.SESSION);
- }
-
- final String error = request.getOptionalProperty(ERROR, request.getContext().getRequestedFile());
- final List<HiddenInputField> hiddenFields = new ArrayList<HiddenInputField>();
- hiddenFields.add(new HiddenInputField(ERROR, error));
- if (view != null) {
- hiddenFields.add(new HiddenInputField(VIEW, view));
- }
- hiddenFields.add(new HiddenInputField("_" + FORM_ID, formId));
-
- final FormState entryState = (FormState) request.getContext().getVariable(ENTRY_FIELDS);
- boolean isforThisForm = entryState != null && entryState.isForForm(formId);
- if (entryState != null && entryState.isForForm(formId)) {
- }
- final InputField nameField = createdField("username", "User Name", InputField.TEXT, isforThisForm ? entryState : null);
- final String width = request.getOptionalProperty("width");
- if (width != null) {
- final int w = Integer.valueOf(width).intValue();
- nameField.setWidth(w);
- }
- final InputField passwordField = createdField("password", "Password", InputField.PASSWORD, isforThisForm ? entryState : null);
- final InputField[] fields = new InputField[] { nameField, passwordField, };
-
- final String formTitle = request.getOptionalProperty(FORM_TITLE);
- final String loginButtonTitle = request.getOptionalProperty(BUTTON_TITLE, "Log in");
- final String className = request.getOptionalProperty(CLASS, "login");
- final String id = request.getOptionalProperty(ID, "logon");
-
- HtmlFormBuilder.createForm(request, "logon.app", hiddenFields.toArray(new HiddenInputField[hiddenFields.size()]), fields,
- className, id, formTitle, labelDelimiter, null, null, loginButtonTitle,
- isforThisForm && entryState != null ? entryState.getError() : null , null);
- }
-
- protected static InputField createdField(final String fieldName, final String fieldLabel, final int type, final FormState entryState) {
- final InputField nameField = new InputField(fieldName);
- nameField.setType(type);
- nameField.setLabel(fieldLabel);
- if (entryState != null) {
- final FieldEditState fieldState = entryState.getField(fieldName);
- final String entry = fieldState == null ? "" : fieldState.getEntry();
- nameField.setValue(entry);
- final String error = fieldState == null ? "" : fieldState.getError();
- nameField.setErrorText(error);
- }
- return nameField;
- }
-
- @Override
- public String getName() {
- return "logon";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/RestrictAccess.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/RestrictAccess.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/RestrictAccess.java
deleted file mode 100644
index 83f2597..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/RestrictAccess.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class RestrictAccess extends AbstractElementProcessor {
- private static final String LOGIN_VIEW = "login-view";
- private static final String DEFAULT_LOGIN_VIEW = "login." + Dispatcher.EXTENSION;
-
- public String getName() {
- return "restrict-access";
- }
-
- public void process(Request request) {
- if (!request.getContext().isUserAuthenticated()) {
- final String view = request.getOptionalProperty(LOGIN_VIEW, DEFAULT_LOGIN_VIEW);
- request.getContext().redirectTo(view);
- }
- }
-
-}
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Secure.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Secure.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Secure.java
deleted file mode 100644
index 17cd472..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/Secure.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
-
-import org.apache.isis.core.commons.authentication.AnonymousSession;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Secure extends AbstractElementProcessor {
- private static final String LOGIN_VIEW = "login-view";
-
- @Override
- public void process(final Request request) {
- final boolean isLoggedIn = !(IsisContext.getSession().getAuthenticationSession() instanceof AnonymousSession);
- if (!isLoggedIn) {
- IsisContext.getMessageBroker().addWarning("You are not currently logged in! Please log in so you can continue.");
- final String view = request.getOptionalProperty(LOGIN_VIEW, "/login.shtml");
- request.getContext().redirectTo(view);
- }
- }
-
- @Override
- public String getName() {
- return "secure";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/User.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/User.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/User.java
deleted file mode 100644
index 4254746..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/logon/User.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.logon;
-
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class User extends AbstractElementProcessor {
- private static final String LOGIN_VIEW = "login-view";
- private static final String DEFAULT_LOGIN_VIEW = "login." + Dispatcher.EXTENSION;
- private static final String LOGOUT_VIEW = "logout-view";
- private static final String DEFAULT_LOGOUT_VIEW = "logout." + Dispatcher.EXTENSION;
-
- @Override
- public void process(final Request request) {
- final boolean isAuthenticatedn = request.getContext().isUserAuthenticated();
- request.appendHtml("<div class=\"user\">");
- if (isAuthenticatedn) {
- displayUserAndLogoutLink(request);
- } else {
- displayLoginForm(request);
- }
- request.appendHtml("</div>");
- }
-
- public void displayLoginForm(final Request request) {
- String loginView = request.getOptionalProperty(LOGIN_VIEW);
- if (loginView == null) {
- Logon.loginForm(request, ".");
- } else {
- if (loginView.trim().length() == 0) {
- loginView = DEFAULT_LOGIN_VIEW;
- }
- request.appendHtml("<a div class=\"link\" href=\"" + loginView + "\">Log in</a>");
- }
- }
-
- public void displayUserAndLogoutLink(final Request request) {
- String user = request.getOptionalProperty(NAME);
- if (user == null) {
- user = (String) request.getContext().getVariable("_username");
- }
- if (user == null) {
- user = IsisContext.getAuthenticationSession().getUserName();
- }
- request.appendHtml("Welcome <span class=\"name\">");
- request.appendAsHtmlEncoded(user);
- request.appendHtml("</span>, ");
- final String logoutView = request.getOptionalProperty(LOGOUT_VIEW, DEFAULT_LOGOUT_VIEW);
- request.appendHtml("<a class=\"link\" href=\"logout.app?view=" + logoutView + "\">Log out</a>");
- }
-
- @Override
- public String getName() {
- return "user";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
deleted file mode 100644
index dc5b39a..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-public abstract class AbstractConditionalBlock extends AbstractElementProcessor {
-
- private static Map<String, Test> tests = new HashMap<String, Test>();
-
- static {
- addNormal(new TestHasRole(), "has-role");
- addNegated(new TestHasRole(), "has-not-role");
-
- addNormal(new TestVariableExists(), "variable-exists");
- addNegated(new TestVariableExists(), "variable-missing");
- addNormal(new TestVariableTrue(), "variable-true");
- addNegated(new TestVariableTrue(), "variable-false");
-
- addNormal(new TestObjectPersistent(), "object-persistent");
- addNegated(new TestObjectPersistent(), "object-transient");
- addNormal(new TestObjectType(), "object-type");
- /*
- * addNormal(new TestObjectIs(), "object-is"); addNegated(new
- * TestObjectIs(), "object-is-not"); addNormal(new TestObjectType(),
- * "object-type"); addNormal(new TestObjectType(),
- * "object-title-equals"); addNegated(new TestObjectType(),
- * "object-title-not-equals"); addNormal(new TestObjectType(),
- * "object-title-contains"); addNegated(new TestObjectType(),
- * "object-title-not-contains");
- */
- addNormal(new TestCollectionFull(), "collection-full");
- addNegated(new TestCollectionFull(), "collection-empty");
- addNormal(new TestCollectionType(), "collection-type");
- // addNormal(new TestCollectionSize(), "collection-size-equal");
- // addNormal(new TestCollectionSize(), "collection-size-less-than");
- // addNormal(new TestCollectionSize(), "collection-size-greater-than");
-
- addNormal(new TestFieldValue(), "test-field");
- addNegated(new TestFieldValue(), "test-field");
-
- addNormal(new TestFieldExists(), "field-exists");
- addNegated(new TestFieldExists(), "field-missing");
- addNormal(new TestFieldVisible(), "field-visible");
- addNegated(new TestFieldVisible(), "field-hidden");
- addNormal(new TestFieldEditable(), "field-editable");
- addNegated(new TestFieldEditable(), "field-not-editable");
- addNormal(new TestFieldType(), "field-type");
- addNormal(new TestFieldSet(), "field-set");
- addNegated(new TestFieldSet(), "field-empty");
- // empty/set etc
-
- addNormal(new TestMethodExists(), "method-exists");
- addNegated(new TestMethodExists(), "method-missing");
- addNormal(new TestMethodVisible(), "method-visible");
- addNegated(new TestMethodVisible(), "method-hidden");
- addNormal(new TestMethodUseable(), "method-useable");
- addNegated(new TestMethodUseable(), "method-not-useable");
-
- }
-
- private static void addNegated(final Test test, final String name) {
- test.name = name;
- test.negateResult = true;
- tests.put(name, test);
- }
-
- private static void addNormal(final Test test, final String name) {
- test.name = name;
- tests.put(name, test);
- }
-
- @Override
- public void process(final Request request) {
- final String id = request.getOptionalProperty(OBJECT);
-
- boolean checkMade = false;
- boolean allConditionsMet = true;
-
- final String[] propertyNames = request.getAttributes().getPropertyNames(new String[] { "object", "collection" });
- for (final String propertyName : propertyNames) {
- boolean result;
- if (propertyName.equals("set")) {
- result = request.isPropertySet("set");
- } else {
- final Test test = tests.get(propertyName);
- if (test == null) {
- throw new ScimpiException("No such test: " + propertyName);
- }
- final String attributeValue = request.getOptionalProperty(propertyName, false);
- result = test.test(request, attributeValue, id);
- if (test.negateResult) {
- result = !result;
- }
- }
- checkMade = true;
- allConditionsMet &= result;
- }
-
- /*
- *
- * // Check variables if
- * (request.isPropertySpecified("variable-exists")) { boolean
- * valuePresent = request.isPropertySet("variable-exists"); checkMade =
- * true; allConditionsMet &= valuePresent; }
- *
- * String variable = request.getOptionalProperty("variable-true"); if
- * (variable != null) { String value = (String)
- * request.getContext().getVariable(variable); checkMade = true;
- * allConditionsMet &= Attributes.isTrue(value); }
- *
- * variable = request.getOptionalProperty("variable-equals"); if
- * (variable != null) { String value = (String)
- * request.getContext().getVariable(variable); checkMade = true;
- * allConditionsMet &= variable.equals(value); }
- */
- // Check Object
-
- /*
- * // Check Collection String collection =
- * request.getOptionalProperty("collection-" + TYPE); if (collection !=
- * null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), collection); Class<?>
- * cls = forClass(request); TypeOfFacet facet =
- * object.getSpecification().getFacet(TypeOfFacet.class); boolean
- * hasType = object != null && (cls == null ||
- * cls.isAssignableFrom(facet.value())); checkMade = true;
- * allConditionsMet &= hasType;; }
- *
- * collection = request.getOptionalProperty("collection-" + "empty"); if
- * (collection != null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), id); CollectionFacet
- * facet = object.getSpecification().getFacet(CollectionFacet.class);
- * boolean isEmpty = facet != null && facet.size(object) == 0;
- * processTags(isEmpty, request); allConditionsMet &= isEmpty; }
- */
-
- // Check Methods
- /*
- * String method = request.getOptionalProperty(METHOD + "-exists"); if
- * (method != null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), id); List<? extends
- * ObjectAction> objectActions =
- * object.getSpecification().getObjectActions(ActionType.USER); boolean
- * methodExists = false; for (ObjectAction objectAssociation :
- * objectActions) { if (objectAssociation.getId().equals(method)) {
- * methodExists = true; break; } } checkMade = true; allConditionsMet &=
- * methodExists; }
- *
- * method = request.getOptionalProperty(METHOD + "-visible"); if (method
- * != null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), id); // TODO needs to
- * work irrespective of parameters ObjectAction objectAction =
- * object.getSpecification().getObjectAction(ActionType.USER, method,
- * ObjectSpecification.EMPTY_LIST); Consent visible =
- * objectAction.isVisible(IsisContext.getAuthenticationSession(),
- * object); checkMade = true; allConditionsMet &= visible.isAllowed(); }
- *
- * method = request.getOptionalProperty(METHOD + "-usable"); if (method
- * != null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), id); // TODO needs to
- * work irrespective of parameters ObjectAction objectAction =
- * object.getSpecification().getObjectAction(ActionType.USER, method,
- * ObjectSpecification.EMPTY_LIST); Consent usable =
- * objectAction.isUsable(IsisContext.getAuthenticationSession(),
- * object); checkMade = true; allConditionsMet &= usable.isAllowed(); }
- *
- *
- * // Check Fields String field = request.getOptionalProperty(FIELD +
- * "-exists"); if (field != null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), id); List<? extends
- * ObjectAssociation> objectFields =
- * object.getSpecification().getAssociations(); boolean fieldExists =
- * false; for (ObjectAssociation objectAssociation : objectFields) { if
- * (objectAssociation.getId().equals(field)) { fieldExists = true;
- * break; } } checkMade = true; allConditionsMet &= fieldExists; }
- *
- * field = request.getOptionalProperty(FIELD + "-visible"); if (field !=
- * null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), id); ObjectAssociation
- * objectField = object.getSpecification().getAssociation(field);
- * Consent visible =
- * objectField.isVisible(IsisContext.getAuthenticationSession(),
- * object); checkMade = true; allConditionsMet &= visible.isAllowed(); }
- *
- * field = request.getOptionalProperty(FIELD + "-editable"); if (field
- * != null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), id); ObjectAssociation
- * objectField = object.getSpecification().getAssociation(field);
- * Consent usable =
- * objectField.isUsable(IsisContext.getAuthenticationSession(), object);
- * checkMade = true; allConditionsMet &= usable.isAllowed(); }
- *
- * field = request.getOptionalProperty(FIELD + "-empty"); if (field !=
- * null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), id); ObjectAssociation
- * objectField = object.getSpecification().getAssociation(field);
- * IsisContext.getPersistenceSession().resolveField(object,
- * objectField); ObjectAdapter fld = objectField.get(object); if (fld ==
- * null) { checkMade = true; allConditionsMet &= true; } else {
- * CollectionFacet facet =
- * fld.getSpecification().getFacet(CollectionFacet.class); boolean
- * isEmpty = facet != null && facet.size(fld) == 0; processTags(isEmpty,
- * request); allConditionsMet &= isEmpty; } }
- *
- * field = request.getOptionalProperty(FIELD + "-set"); if (field !=
- * null) { ObjectAdapter object =
- * MethodsUtils.findObject(request.getContext(), id); ObjectAssociation
- * objectField = object.getSpecification().getAssociation(field);
- * IsisContext.getPersistenceSession().resolveField(object,
- * objectField); ObjectAdapter fld = objectField.get(object); if (fld ==
- * null) { throw new ScimpiException("No object for field-set " +
- * field); } Object fieldValue = fld.getObject(); if (fieldValue
- * instanceof Boolean) { checkMade = true; allConditionsMet &=
- * ((Boolean) fieldValue).booleanValue(); } else { checkMade = true;
- * allConditionsMet &= true; } }
- */
-
- // Check User
- /*
- * String hasRole = request.getOptionalProperty("has-role"); if (hasRole
- * != null) { AuthenticationSession session =
- * IsisContext.getSession().getAuthenticationSession(); List<String>
- * roles = session.getRoles(); boolean hasMatchingRole = false; for
- * (String role : roles) { if (role.equals(hasRole.trim())) {
- * hasMatchingRole = true; break; } } checkMade = true; allConditionsMet
- * &= hasMatchingRole; }
- */
-
- final String persistent = request.getOptionalProperty("persistent");
- if (persistent != null) {
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(persistent);
- checkMade = true;
- allConditionsMet &= object.representsPersistent();
- }
- /*
- * String type = request.getOptionalProperty(TYPE); if (type != null) {
- * ObjectAdapter object = MethodsUtils.findObject(request.getContext(),
- * id); Class<?> cls = forClass(request); boolean hasType = object !=
- * null && (cls == null ||
- * cls.isAssignableFrom(object.getObject().getClass())); checkMade =
- * true; allConditionsMet &= hasType;; }
- */
- if (request.isPropertySpecified("empty")) {
- if (request.isPropertySet("empty")) {
- final String collection = request.getOptionalProperty("empty");
- if (collection != null) {
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(collection);
- final CollectionFacet facet = object.getSpecification().getFacet(CollectionFacet.class);
- checkMade = true;
- allConditionsMet &= facet.size(object) == 0;
- }
- } else {
- checkMade = true;
- allConditionsMet &= true;
- }
- }
-
- if (request.isPropertySpecified("set")) {
- final boolean valuePresent = request.isPropertySet("set");
- checkMade = true;
- allConditionsMet &= valuePresent;
- }
-
- if (checkMade) {
- processTags(allConditionsMet, request);
- } else {
- throw new ScimpiException("No condition in " + getName());
- }
- }
-
- protected abstract void processTags(boolean isSet, Request request);
-
-}
-
-abstract class Test {
- String name;
- boolean negateResult;
-
- abstract boolean test(Request request, String attributeName, String targetId);
-
- protected Class<?> forClass(final String className) {
- Class<?> cls = null;
- if (className != null) {
- try {
- cls = Class.forName(className);
- } catch (final ClassNotFoundException e) {
- throw new ScimpiException("No class for " + className, e);
- }
- }
- return cls;
- }
-
- protected ObjectAction findMethod(final String attributeName, final ObjectAdapter object) {
- final ObjectAction objectAction = object.getSpecification().getObjectAction(ActionType.USER, attributeName, ObjectSpecification.EMPTY_LIST);
- if (objectAction == null) {
- throw new ScimpiException("No such method found in " + object.getSpecification().getIdentifier().getClassName() + " : " + attributeName);
- }
- return objectAction;
- }
-
- protected ObjectAssociation findProperty(final String attributeName, final ObjectAdapter object) {
- final ObjectAssociation objectField = object.getSpecification().getAssociation(attributeName);
- if (objectField == null) {
- throw new ScimpiException("No such property found in " + object.getSpecification().getIdentifier().getClassName() + ": " + attributeName);
- }
- return objectField;
- }
-
-}
-
-class TestVariableExists extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- Object variable = request.getContext().getVariable(attributeName);
- if (variable instanceof String && ((String) variable).equals("")) {
- return false;
- }
- return variable != null;
- }
-}
-
-class TestVariableTrue extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final Object variable = request.getContext().getVariable(attributeName);
- final Boolean value = variable instanceof Boolean ? (Boolean) variable : Boolean.valueOf((String) variable);
- return value != null && value.booleanValue();
- }
-}
-
-class TestObjectPersistent extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = request.getContext().getMappedObjectOrResult(attributeName);
- return object.representsPersistent();
- }
-}
-
-class TestObjectType extends TestObjectPersistent {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- final Class<?> cls = forClass(attributeName);
- final boolean hasType = object != null && (cls == null || cls.isAssignableFrom(object.getObject().getClass()));
- return hasType;
- }
-}
-
-class TestCollectionType extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- final Class<?> cls = forClass(attributeName);
- final TypeOfFacet facet = object.getSpecification().getFacet(TypeOfFacet.class);
- final boolean hasType = object != null && (cls == null || cls.isAssignableFrom(facet.value()));
- return hasType;
- }
-}
-
-class TestCollectionFull extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), attributeName);
- final CollectionFacet facet = object.getSpecification().getFacet(CollectionFacet.class);
- final boolean isEmpty = facet != null && facet.size(object) == 0;
- return !isEmpty;
- }
-}
-
-class TestMethodExists extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- final List<? extends ObjectAction> objectActions = object.getSpecification().getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
- boolean methodExists = false;
- for (final ObjectAction objectAssociation : objectActions) {
- if (objectAssociation.getId().equals(attributeName)) {
- methodExists = true;
- break;
- }
- }
- return methodExists;
- }
-}
-
-class TestMethodVisible extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- // TODO needs to work irrespective of parameters
- final ObjectAction objectAction = findMethod(attributeName, object);
- final Consent visible = objectAction.isVisible(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE);
- return visible.isAllowed();
- }
-}
-
-class TestMethodUseable extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- // TODO needs to work irrespective of parameters
- final ObjectAction objectAction = findMethod(attributeName, object);
- final Consent usable = objectAction.isUsable(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE);
- return usable.isAllowed();
- }
-}
-
-class TestFieldExists extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- final List<? extends ObjectAssociation> objectFields = object.getSpecification().getAssociations(Contributed.EXCLUDED);
- boolean fieldExists = false;
- for (final ObjectAssociation objectAssociation : objectFields) {
- if (objectAssociation.getId().equals(attributeName)) {
- fieldExists = true;
- break;
- }
- }
- return fieldExists;
- }
-}
-
-class TestFieldVisible extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- final ObjectAssociation objectField = findProperty(attributeName, object);
- final Consent visible = objectField.isVisible(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE);
- return visible.isAllowed();
- }
-}
-
-class TestFieldEditable extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- final ObjectAssociation objectField = findProperty(attributeName, object);
- final Consent usable = objectField.isUsable(IsisContext.getAuthenticationSession(), object, Where.ANYWHERE);
- return usable.isAllowed();
- }
-}
-
-class TestFieldType extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- final Class<?> cls = forClass(attributeName);
- final boolean hasType = object != null && (cls == null || cls.isAssignableFrom(object.getObject().getClass()));
- return hasType;
- }
-}
-
-class TestFieldSet extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- final ObjectAssociation objectField = findProperty(attributeName, object);
-
- ResolveFieldUtil.resolveField(object, objectField);
- final ObjectAdapter fld = objectField.get(object);
- if (fld != null) {
- final Object fieldValue = fld.getObject();
- if (fieldValue instanceof Boolean) {
- return ((Boolean) fieldValue).booleanValue();
- } else if (fld.getSpecification().containsFacet(CollectionFacet.class)) {
- final CollectionFacet facet = fld.getSpecification().getFacet(CollectionFacet.class);
- final boolean isEmpty = facet != null && facet.size(fld) == 0;
- return !isEmpty;
- } else {
- return true;
- }
- }
- return false;
- }
-}
-
-class TestFieldValue extends Test {
- @Override
- boolean test(Request request, String attributeName, String targetId) {
- int pos = attributeName.indexOf("==");
- // TODO test for other comparators
- // TODO fail properly if none found
- String fieldName = attributeName.substring(0, pos);
- String fieldValue = attributeName.substring(pos + 2);
-
- final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
- final ObjectAssociation objectField = findProperty(fieldName, object);
- ResolveFieldUtil.resolveField(object, objectField);
- final ObjectAdapter fld = objectField.get(object);
-
- // TODO test for reference or value
- final ObjectAdapter object2 = MethodsUtils.findObject(request.getContext(), fieldValue);
-
- if (fld == object2) {
- return true;
- }
- return false;
- }
-
-}
-
-class TestHasRole extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final String[] requiredRoles = attributeName.split("\\|");
- final AuthenticationSession session = IsisContext.getSession().getAuthenticationSession();
- final List<String> sessionRoles = session.getRoles();
- for (final String sessionRole : sessionRoles) {
- for (final String requiredRole : requiredRoles) {
- if (requiredRole.trim().equals(sessionRole)) {
- return true;
- }
- }
- }
- return false;
- }
-}
-
-class TestSet extends Test {
- @Override
- boolean test(final Request request, final String attributeName, final String targetId) {
- final boolean valuePresent = request.isPropertySet("set");
- return valuePresent;
- }
-}
-
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
deleted file mode 100644
index b6798be..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
-
-public abstract class AbstractLink extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String title = request.getOptionalProperty(FORM_TITLE);
- final String name = request.getOptionalProperty(NAME);
- final boolean showAsButton = request.isRequested("show-as-button", false);
- final String linkClass = request.getOptionalProperty(CLASS, showAsButton ? "button" : defaultLinkClass());
- final String containerClass = request.getOptionalProperty(CONTAINER_CLASS, "action");
- final String object = request.getOptionalProperty(OBJECT);
- final RequestContext context = request.getContext();
- String objectId = object != null ? object : (String) context.getVariable(RequestContext.RESULT);
- ObjectAdapter adapter = MethodsUtils.findObject(context, objectId);
-
- // REVIEW this is common used code
- final String fieldName = request.getOptionalProperty(FIELD);
- if (fieldName != null) {
- final ObjectAssociation field = adapter.getSpecification().getAssociation(fieldName);
- if (field == null) {
- throw new ScimpiException("No field " + fieldName + " in " + adapter.getSpecification().getFullIdentifier());
- }
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- final Where where = Where.ANYWHERE;
-
- if (field.isVisible(IsisContext.getAuthenticationSession(), adapter, where).isVetoed()) {
- throw new ForbiddenException(field, ForbiddenException.VISIBLE);
- }
- ResolveFieldUtil.resolveField(adapter, field);
- adapter = field.get(adapter);
- if (adapter != null) {
- objectId = context.mapObject(adapter, Scope.INTERACTION);
- }
- }
-
- if (adapter != null && valid(request, adapter)) {
- final String variable = request.getOptionalProperty("param-name", RequestContext.RESULT);
- final String variableSegment = variable + "=" + objectId;
-
- String view = request.getOptionalProperty(VIEW);
- if (view == null) {
- view = defaultView();
- }
- view = context.fullUriPath(view);
- final String classSegment = " class=\"" + linkClass + "\"";
- final String titleSegment = title == null ? "" : (" title=\"" + title + "\"");
- String additionalSegment = additionalParameters(request);
- additionalSegment = additionalSegment == null ? "" : "&" + additionalSegment;
- if (showAsButton) {
- request.appendHtml("<div class=\"" + containerClass + "\">");
- }
- request.appendHtml("<a" + classSegment + titleSegment + " href=\"" + view + "?" + variableSegment + context.encodedInteractionParameters() + additionalSegment + "\">");
- request.pushNewBuffer();
- request.processUtilCloseTag();
- final String buffer = request.popBuffer();
- if (buffer.trim().length() > 0) {
- request.appendHtml(buffer);
- } else {
- request.appendAsHtmlEncoded(linkLabel(name, adapter));
- }
- request.appendHtml("</a>");
- if (showAsButton) {
- request.appendHtml("</div>");
- }
- } else {
- request.skipUntilClose();
- }
- }
-
- private String defaultLinkClass() {
- return "action";
- }
-
- protected abstract String linkLabel(String name, ObjectAdapter object);
-
- protected String additionalParameters(final Request request) {
- return null;
- }
-
- protected abstract boolean valid(Request request, ObjectAdapter adapter);
-
- protected abstract String defaultView();
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockDefine.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockDefine.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockDefine.java
deleted file mode 100644
index cea5d11..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockDefine.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
-
-public class BlockDefine extends AbstractElementProcessor {
-
- @Override
- public String getName() {
- return "block";
- }
-
- @Override
- public void process(final Request request) {
- final String name = request.getOptionalProperty(NAME, "unamed");
- final RepeatMarker start = request.createMarker();
- request.skipUntilClose();
- request.getContext().addVariable("_block-" + name, start, Scope.REQUEST);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockUse.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockUse.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockUse.java
deleted file mode 100644
index efd6128..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/BlockUse.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request.RepeatMarker;
-
-public class BlockUse extends AbstractElementProcessor {
-
- @Override
- public String getName() {
- return "use-block";
- }
-
- @Override
- public void process(final Request request) {
- final String name = request.getOptionalProperty(NAME, "unamed");
- request.closeEmpty();
- final RepeatMarker end = request.createMarker();
-
- final RepeatMarker marker = (RepeatMarker) request.getContext().getVariable("_block-" + name);
- marker.repeat();
-
- request.processUtilCloseTag();
- end.repeat();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Commit.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Commit.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Commit.java
deleted file mode 100644
index 4106fd9..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Commit.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Commit extends AbstractElementProcessor {
-
- @Override
- public String getName() {
- return "commit";
- }
-
- @Override
- public void process(final Request request) {
- // Note - the session will have changed since the earlier call if a user
- // has logged in or out in the action
- // processing above.
- final IsisTransactionManager transactionManager = IsisContext.getPersistenceSession().getTransactionManager();
- if (transactionManager.getTransaction().getState().canCommit()) {
- transactionManager.endTransaction();
- transactionManager.startTransaction();
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ContentTag.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ContentTag.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ContentTag.java
deleted file mode 100644
index ddda339..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ContentTag.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.ElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class ContentTag implements ElementProcessor {
-
- @Override
- public String getName() {
- return "content";
- }
-
- @Override
- public void process(final Request request) {
- request.appendHtml("<!-- apply content -->");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/CookieValue.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/CookieValue.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/CookieValue.java
deleted file mode 100644
index 09e56b0..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/CookieValue.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class CookieValue extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- String name = request.getRequiredProperty(NAME);
- String resultName = request.getOptionalProperty(RESULT_NAME, name);
- final String scopeName = request.getOptionalProperty(SCOPE);
- final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
-
- String cookieString = request.getContext().getCookie(name);
-
- request.appendDebug(" " + resultName + " (" + scope + ") set to " + cookieString + " from cookie " + name);
- request.getContext().addVariable(resultName, cookieString, scope);
- }
-
- @Override
- public String getName() {
- return "cookie-value";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/DefaultValue.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/DefaultValue.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/DefaultValue.java
deleted file mode 100644
index 2cd9593..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/DefaultValue.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class DefaultValue extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- // String sourceObjectId = objectOrResult(request);
- final String variableName = request.getRequiredProperty(NAME);
- final String defaultValue = request.getOptionalProperty(VALUE);
- final String scopeName = request.getOptionalProperty(SCOPE);
- final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
-
- final RequestContext context = request.getContext();
- final Object currentValue = context.getVariable(variableName);
- if (currentValue == null) {
- request.appendDebug(" " + variableName + " set to " + defaultValue + " (" + scope + ")");
- context.addVariable(variableName, defaultValue, scope);
- } else {
- request.appendDebug(" " + variableName + " alreadt set to " + currentValue);
- }
- }
-
- @Override
- public String getName() {
- return "default";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
deleted file mode 100644
index ab43eb6..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import java.util.List;
-
-import org.apache.isis.applib.annotation.When;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class EditLink extends AbstractLink {
-
- // REVIEW: should provide this rendering context, rather than hardcoding.
- // the net effect currently is that class members annotated with
- // @Hidden(where=Where.ANYWHERE) or @Disabled(where=Where.ANYWHERE) will indeed
- // be hidden/disabled, but will be visible/enabled (perhaps incorrectly)
- // for any other value for Where
- private final Where where = Where.ANYWHERE;
-
- @Override
- protected boolean valid(final Request request, final ObjectAdapter adapter) {
- final ObjectSpecification specification = adapter.getSpecification();
- final AuthenticationSession session = IsisContext.getAuthenticationSession();
- final List<ObjectAssociation> visibleFields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, adapter, where));
- final ImmutableFacet facet = specification.getFacet(ImmutableFacet.class);
- final boolean isImmutable = facet != null && facet.when() == When.ALWAYS;
- final boolean isImmutableOncePersisted = facet != null && facet.when() == When.ONCE_PERSISTED && adapter.representsPersistent();
- return visibleFields.size() > 0 && !isImmutable && !isImmutableOncePersisted;
- }
-
- @Override
- protected String linkLabel(final String name, final ObjectAdapter object) {
- return "edit";
- }
-
- @Override
- protected String defaultView() {
- return Dispatcher.GENERIC + Dispatcher.EDIT + "." + Dispatcher.EXTENSION;
- }
-
- @Override
- public String getName() {
- return "edit-link";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EndSession.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EndSession.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EndSession.java
deleted file mode 100644
index 1a37f99..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EndSession.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class EndSession extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- request.getContext().endHttpSession();
- }
-
- @Override
- public String getName() {
- return "end-session";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Forward.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Forward.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Forward.java
deleted file mode 100644
index e63ec92..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Forward.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Forward extends AbstractElementProcessor {
-
- @Override
- public String getName() {
- return "forward";
- }
-
- @Override
- public void process(final Request request) {
- final String view = request.getRequiredProperty(VIEW);
- request.getContext().forward(view);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/GetCookie.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/GetCookie.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/GetCookie.java
deleted file mode 100644
index f58b13f..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/GetCookie.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class GetCookie extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- final String name = request.getRequiredProperty("name");
- final String cookie = request.getContext().getCookie(name);
-
- request.appendHtml(cookie);
- }
-
- @Override
- public String getName() {
- return "get-cookie";
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Import.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Import.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Import.java
deleted file mode 100644
index 1b66290..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Import.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class Import extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- request.appendHtml("<!-- " + " import " + request.getOptionalProperty("file") + " -->");
- }
-
- @Override
- public String getName() {
- return "import";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromCookie.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromCookie.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromCookie.java
deleted file mode 100644
index 1e3f47e..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromCookie.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class InitializeFromCookie extends AbstractElementProcessor {
- private static final String SEVEN_DAYS = Integer.toString(60 * 24 * 7);
-
- @Override
- public void process(final Request request) {
- final String name = request.getRequiredProperty(NAME);
-
- final RequestContext context = request.getContext();
- if (context.getVariable(name) != null) {
- request.skipUntilClose();
- } else {
- final String scopeName = request.getOptionalProperty(SCOPE);
- final Scope scope = RequestContext.scope(scopeName, Scope.SESSION);
-
- final String cookieName = request.getOptionalProperty("cookie", name);
- final String cookieValue = context.getCookie(cookieName);
- boolean hasObject;
- if (cookieValue != null) {
- try {
- context.getMappedObject(cookieValue);
- hasObject = true;
- } catch (final ObjectNotFoundException e) {
- hasObject = false;
- }
- } else {
- hasObject = false;
- }
-
- if (hasObject) {
- request.skipUntilClose();
- context.addVariable(name, cookieValue, scope);
- } else {
- final String expiresString = request.getOptionalProperty("expires", SEVEN_DAYS);
- request.pushNewBuffer();
- request.processUtilCloseTag();
- request.popBuffer();
- final String id = (String) context.getVariable(RequestContext.RESULT);
- final ObjectAdapter variable = context.getMappedObject(id);
- if (variable != null) {
- context.addCookie(cookieName, id, Integer.valueOf(expiresString));
- context.addVariable(name, id, scope);
- }
- }
- }
- }
-
- @Override
- public String getName() {
- return "initialize-from-cookie";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromResult.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromResult.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromResult.java
deleted file mode 100644
index 375fdd2..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/InitializeFromResult.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
-import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-public class InitializeFromResult extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- disallowSourceAndDefault(request);
- final String sourceObjectId = objectOrResult(request);
- final Class<?> cls = forClass(request);
- final String variableName = request.getRequiredProperty(NAME);
- final String defaultObjectId = request.getOptionalProperty(DEFAULT);
- final String scopeName = request.getOptionalProperty(SCOPE);
- final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST);
-
- final RequestContext context = request.getContext();
- final ObjectAdapter sourceObject = context.getMappedObject(sourceObjectId);
- final boolean isSourceSet = sourceObject != null;
- final boolean isSourceAssignable = isSourceSet && (cls == null || cls.isAssignableFrom(sourceObject.getObject().getClass()));
- if (isSourceAssignable) {
- request.appendDebug(" " + variableName + " set to " + sourceObjectId + " (" + scope + ")");
- context.addVariable(variableName, sourceObjectId, scope);
- } else {
- request.appendDebug(" " + variableName + " set to " + sourceObjectId + " (" + scope + ")");
- if (defaultObjectId != null) {
- context.addVariable(variableName, defaultObjectId, scope);
- }
- context.changeScope(variableName, scope);
- }
- }
-
- private String objectOrResult(final Request request) {
- final String sourceObjectId = request.getOptionalProperty(OBJECT);
- if (sourceObjectId == null) {
- return (String) request.getContext().getVariable(RequestContext.RESULT);
- } else {
- return sourceObjectId;
- }
- }
-
- private void disallowSourceAndDefault(final Request request) {
- if (request.getOptionalProperty(DEFAULT) != null && request.getOptionalProperty(OBJECT) != null) {
- throw new ScimpiException("Cannot specify both " + OBJECT + " and " + DEFAULT + " for the " + getName() + " element");
- }
- }
-
- @Override
- public String getName() {
- return "initialize";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/2c7cfbfe/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Localization.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Localization.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Localization.java
deleted file mode 100644
index fe1474b..0000000
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/Localization.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
-
-import java.util.Locale;
-import java.util.TimeZone;
-
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
-
-/**
- * Displays the localization data for the current user.
- */
-public class Localization extends AbstractElementProcessor {
-
- @Override
- public void process(final Request request) {
- request.closeEmpty();
-
- org.apache.isis.applib.profiles.Localization localization = IsisContext.getLocalization();
- if (localization != null) {
- Locale locale = localization.getLocale();
- String country = locale.getDisplayName();
- // country = locale.toString();
- String timeZone = localization.getTimeZone().getDisplayName();
-
- request.appendAsHtmlEncoded(country + ", " + timeZone);
- } else {
- request.appendAsHtmlEncoded("No localization data!");
- }
-
- Locale locale = Locale.getDefault();
- String country = locale.getDisplayName();
- // country = locale.toString();
- String timeZone = TimeZone.getDefault().getDisplayName();
-
- request.appendAsHtmlEncoded("\n (Default " + country + ", " + timeZone +")");
-
- }
-
- @Override
- public String getName() {
- return "alpha-localization";
- }
-
-}
[38/59] [abbrv] isis git commit: ISIS-789: adding
example/application/neoapp
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/fa30a76a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror.js b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror.js
new file mode 100644
index 0000000..48773cb
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/cy2neo/scripts/codemirror.js
@@ -0,0 +1,5909 @@
+// CodeMirror is the only global var we claim
+window.CodeMirror = (function() {
+ "use strict";
+
+ // BROWSER SNIFFING
+
+ // Crude, but necessary to handle a number of hard-to-feature-detect
+ // bugs and behavior differences.
+ var gecko = /gecko\/\d/i.test(navigator.userAgent);
+ var ie = /MSIE \d/.test(navigator.userAgent);
+ var ie_lt8 = ie && (document.documentMode == null || document.documentMode < 8);
+ var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);
+ var webkit = /WebKit\//.test(navigator.userAgent);
+ var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);
+ var chrome = /Chrome\//.test(navigator.userAgent);
+ var opera = /Opera\//.test(navigator.userAgent);
+ var safari = /Apple Computer/.test(navigator.vendor);
+ var khtml = /KHTML\//.test(navigator.userAgent);
+ var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent);
+ var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);
+ var phantom = /PhantomJS/.test(navigator.userAgent);
+
+ var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);
+ // This is woefully incomplete. Suggestions for alternative methods welcome.
+ var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);
+ var mac = ios || /Mac/.test(navigator.platform);
+ var windows = /win/i.test(navigator.platform);
+
+ var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
+ if (opera_version) opera_version = Number(opera_version[1]);
+ if (opera_version && opera_version >= 15) { opera = false; webkit = true; }
+ // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
+ var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
+ var captureMiddleClick = gecko || (ie && !ie_lt9);
+
+ // Optimize some code when these features are not used
+ var sawReadOnlySpans = false, sawCollapsedSpans = false;
+
+ // CONSTRUCTOR
+
+ function CodeMirror(place, options) {
+ if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
+
+ this.options = options = options || {};
+ // Determine effective options based on given values and defaults.
+ for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt)) {
+ options[opt] = defaults[opt];
+ }
+console.log("CM",options)
+ setGuttersForLineNumbers(options);
+ var docStart = typeof options.value == "string" ? 0 : options.value.first;
+ var display = this.display = makeDisplay(place, docStart);
+ display.wrapper.CodeMirror = this;
+ updateGutters(this);
+ if (options.autofocus && !mobile) focusInput(this);
+
+ this.state = {keyMaps: [],
+ overlays: [],
+ modeGen: 0,
+ overwrite: false, focused: false,
+ suppressEdits: false, pasteIncoming: false,
+ draggingText: false,
+ highlight: new Delayed()};
+
+ themeChanged(this);
+ if (options.lineWrapping)
+ this.display.wrapper.className += " CodeMirror-wrap";
+
+ var doc = options.value;
+ if (typeof doc == "string") doc = new Doc(options.value, options.mode);
+ operation(this, attachDoc)(this, doc);
+
+ // Override magic textarea content restore that IE sometimes does
+ // on our hidden textarea on reload
+ if (ie) setTimeout(bind(resetInput, this, true), 20);
+
+ registerEventHandlers(this);
+ // IE throws unspecified error in certain cases, when
+ // trying to access activeElement before onload
+ var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { }
+ if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20);
+ else onBlur(this);
+
+ operation(this, function() {
+ for (var opt in optionHandlers)
+ if (optionHandlers.propertyIsEnumerable(opt))
+ optionHandlers[opt](this, options[opt], Init);
+ for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
+ })();
+ }
+
+ // DISPLAY CONSTRUCTOR
+
+ function makeDisplay(place, docStart) {
+ var d = {};
+
+ var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none; font-size: 4px;");
+ if (webkit) input.style.width = "1000px";
+ else input.setAttribute("wrap", "off");
+ // if border: 0; -- iOS fails to open keyboard (issue #1287)
+ if (ios) input.style.border = "1px solid black";
+ input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false");
+
+ // Wraps and hides input textarea
+ d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
+ // The actual fake scrollbars.
+ d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar");
+ d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar");
+ d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
+ d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
+ // DIVs containing the selection and the actual code
+ d.lineDiv = elt("div", null, "CodeMirror-code");
+ d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
+ // Blinky cursor, and element used to ensure cursor fits at the end of a line
+ d.cursor = elt("div", "\u00a0", "CodeMirror-cursor");
+ // Secondary cursor, shown when on a 'jump' in bi-directional text
+ d.otherCursor = elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor");
+ // Used to measure text size
+ d.measure = elt("div", null, "CodeMirror-measure");
+ // Wraps everything that needs to exist inside the vertically-padded coordinate system
+ d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor],
+ null, "position: relative; outline: none");
+ // Moved around its parent to cover visible view
+ d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
+ // Set to the height of the text, causes scrolling
+ d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
+ // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers
+ d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerCutOff + "px; width: 1px;");
+ // Will contain the gutters, if any
+ d.gutters = elt("div", null, "CodeMirror-gutters");
+ d.lineGutter = null;
+ // Provides scrolling
+ d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
+ d.scroller.setAttribute("tabIndex", "-1");
+ // The element in which the editor lives.
+ d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV,
+ d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
+ // Work around IE7 z-index bug
+ if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
+ if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper);
+
+ // Needed to hide big blue blinking cursor on Mobile Safari
+ if (ios) input.style.width = "0px";
+ if (!webkit) d.scroller.draggable = true;
+ // Needed to handle Tab key in KHTML
+ if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; }
+ // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
+ else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px";
+
+ // Current visible range (may be bigger than the view window).
+ d.viewOffset = d.lastSizeC = 0;
+ d.showingFrom = d.showingTo = docStart;
+
+ // Used to only resize the line number gutter when necessary (when
+ // the amount of lines crosses a boundary that makes its width change)
+ d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
+ // See readInput and resetInput
+ d.prevInput = "";
+ // Set to true when a non-horizontal-scrolling widget is added. As
+ // an optimization, widget aligning is skipped when d is false.
+ d.alignWidgets = false;
+ // Flag that indicates whether we currently expect input to appear
+ // (after some event like 'keypress' or 'input') and are polling
+ // intensively.
+ d.pollingFast = false;
+ // Self-resetting timeout for the poller
+ d.poll = new Delayed();
+
+ d.cachedCharWidth = d.cachedTextHeight = null;
+ d.measureLineCache = [];
+ d.measureLineCachePos = 0;
+
+ // Tracks when resetInput has punted to just putting a short
+ // string instead of the (large) selection.
+ d.inaccurateSelection = false;
+
+ // Tracks the maximum line length so that the horizontal scrollbar
+ // can be kept static when scrolling.
+ d.maxLine = null;
+ d.maxLineLength = 0;
+ d.maxLineChanged = false;
+
+ // Used for measuring wheel scrolling granularity
+ d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
+
+ return d;
+ }
+
+ // STATE UPDATES
+
+ // Used to get the editor into a consistent state again when options change.
+
+ function loadMode(cm) {
+ cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
+ cm.doc.iter(function(line) {
+ if (line.stateAfter) line.stateAfter = null;
+ if (line.styles) line.styles = null;
+ });
+ cm.doc.frontier = cm.doc.first;
+ startWorker(cm, 100);
+ cm.state.modeGen++;
+ if (cm.curOp) regChange(cm);
+ }
+
+ function wrappingChanged(cm) {
+ if (cm.options.lineWrapping) {
+ cm.display.wrapper.className += " CodeMirror-wrap";
+ cm.display.sizer.style.minWidth = "";
+ } else {
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", "");
+ computeMaxLength(cm);
+ }
+ estimateLineHeights(cm);
+ regChange(cm);
+ clearCaches(cm);
+ setTimeout(function(){updateScrollbars(cm);}, 100);
+ }
+
+ function estimateHeight(cm) {
+ var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
+ var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
+ return function(line) {
+ if (lineIsHidden(cm.doc, line))
+ return 0;
+ else if (wrapping)
+ return (Math.ceil(line.text.length / perLine) || 1) * th;
+ else
+ return th;
+ };
+ }
+
+ function estimateLineHeights(cm) {
+ var doc = cm.doc, est = estimateHeight(cm);
+ doc.iter(function(line) {
+ var estHeight = est(line);
+ if (estHeight != line.height) updateLineHeight(line, estHeight);
+ });
+ }
+
+ function keyMapChanged(cm) {
+ var map = keyMap[cm.options.keyMap], style = map.style;
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
+ (style ? " cm-keymap-" + style : "");
+ cm.state.disableInput = map.disableInput;
+ }
+
+ function themeChanged(cm) {
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
+ cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
+ clearCaches(cm);
+ }
+
+ function guttersChanged(cm) {
+ updateGutters(cm);
+ regChange(cm);
+ setTimeout(function(){alignHorizontally(cm);}, 20);
+ }
+
+ function updateGutters(cm) {
+ var gutters = cm.display.gutters, specs = cm.options.gutters;
+ removeChildren(gutters);
+ for (var i = 0; i < specs.length; ++i) {
+ var gutterClass = specs[i];
+ var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
+ if (gutterClass == "CodeMirror-linenumbers") {
+ cm.display.lineGutter = gElt;
+ gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
+ }
+ }
+ gutters.style.display = i ? "" : "none";
+ }
+
+ function lineLength(doc, line) {
+ if (line.height == 0) return 0;
+ var len = line.text.length, merged, cur = line;
+ while (merged = collapsedSpanAtStart(cur)) {
+ var found = merged.find();
+ cur = getLine(doc, found.from.line);
+ len += found.from.ch - found.to.ch;
+ }
+ cur = line;
+ while (merged = collapsedSpanAtEnd(cur)) {
+ var found = merged.find();
+ len -= cur.text.length - found.from.ch;
+ cur = getLine(doc, found.to.line);
+ len += cur.text.length - found.to.ch;
+ }
+ return len;
+ }
+
+ function computeMaxLength(cm) {
+ var d = cm.display, doc = cm.doc;
+ d.maxLine = getLine(doc, doc.first);
+ d.maxLineLength = lineLength(doc, d.maxLine);
+ d.maxLineChanged = true;
+ doc.iter(function(line) {
+ var len = lineLength(doc, line);
+ if (len > d.maxLineLength) {
+ d.maxLineLength = len;
+ d.maxLine = line;
+ }
+ });
+ }
+
+ // Make sure the gutters options contains the element
+ // "CodeMirror-linenumbers" when the lineNumbers option is true.
+ function setGuttersForLineNumbers(options) {
+ var found = indexOf(options.gutters, "CodeMirror-linenumbers");
+ if (found == -1 && options.lineNumbers) {
+ options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);
+ } else if (found > -1 && !options.lineNumbers) {
+ options.gutters = options.gutters.slice(0);
+ options.gutters.splice(found, 1);
+ }
+ }
+
+ // SCROLLBARS
+
+ // Re-synchronize the fake scrollbars with the actual size of the
+ // content. Optionally force a scrollTop.
+ function updateScrollbars(cm) {
+ var d = cm.display, docHeight = cm.doc.height;
+ var totalHeight = docHeight + paddingVert(d);
+ d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px";
+ d.gutters.style.height = Math.max(totalHeight, d.scroller.clientHeight - scrollerCutOff) + "px";
+ var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight);
+ var needsH = d.scroller.scrollWidth > (d.scroller.clientWidth + 1);
+ var needsV = scrollHeight > (d.scroller.clientHeight + 1);
+ if (needsV) {
+ d.scrollbarV.style.display = "block";
+ d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0";
+ d.scrollbarV.firstChild.style.height =
+ (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px";
+ } else {
+ d.scrollbarV.style.display = "";
+ d.scrollbarV.firstChild.style.height = "0";
+ }
+ if (needsH) {
+ d.scrollbarH.style.display = "block";
+ d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0";
+ d.scrollbarH.firstChild.style.width =
+ (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px";
+ } else {
+ d.scrollbarH.style.display = "";
+ d.scrollbarH.firstChild.style.width = "0";
+ }
+ if (needsH && needsV) {
+ d.scrollbarFiller.style.display = "block";
+ d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px";
+ } else d.scrollbarFiller.style.display = "";
+ if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
+ d.gutterFiller.style.display = "block";
+ d.gutterFiller.style.height = scrollbarWidth(d.measure) + "px";
+ d.gutterFiller.style.width = d.gutters.offsetWidth + "px";
+ } else d.gutterFiller.style.display = "";
+
+ if (mac_geLion && scrollbarWidth(d.measure) === 0) {
+ d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px";
+ d.scrollbarV.style.pointerEvents = d.scrollbarH.style.pointerEvents = "none";
+ }
+ }
+
+ function visibleLines(display, doc, viewPort) {
+ var top = display.scroller.scrollTop, height = display.wrapper.clientHeight;
+ if (typeof viewPort == "number") top = viewPort;
+ else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;}
+ top = Math.floor(top - paddingTop(display));
+ var bottom = Math.ceil(top + height);
+ return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)};
+ }
+
+ // LINE NUMBERS
+
+ function alignHorizontally(cm) {
+ var display = cm.display;
+ if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
+ var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
+ var gutterW = display.gutters.offsetWidth, l = comp + "px";
+ for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) {
+ for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l;
+ }
+ if (cm.options.fixedGutter)
+ display.gutters.style.left = (comp + gutterW) + "px";
+ }
+
+ function maybeUpdateLineNumberWidth(cm) {
+ if (!cm.options.lineNumbers) return false;
+ var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
+ if (last.length != display.lineNumChars) {
+ var test = display.measure.appendChild(elt("div", [elt("div", last)],
+ "CodeMirror-linenumber CodeMirror-gutter-elt"));
+ var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
+ display.lineGutter.style.width = "";
+ display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);
+ display.lineNumWidth = display.lineNumInnerWidth + padding;
+ display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
+ display.lineGutter.style.width = display.lineNumWidth + "px";
+ return true;
+ }
+ return false;
+ }
+
+ function lineNumberFor(options, i) {
+ return String(options.lineNumberFormatter(i + options.firstLineNumber));
+ }
+ function compensateForHScroll(display) {
+ return getRect(display.scroller).left - getRect(display.sizer).left;
+ }
+
+ // DISPLAY DRAWING
+
+ function updateDisplay(cm, changes, viewPort, forced) {
+ var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated;
+ var visible = visibleLines(cm.display, cm.doc, viewPort);
+ for (var first = true;; first = false) {
+ var oldWidth = cm.display.scroller.clientWidth;
+ if (!updateDisplayInner(cm, changes, visible, forced)) break;
+ updated = true;
+ changes = [];
+ updateSelection(cm);
+ updateScrollbars(cm);
+ if (first && cm.options.lineWrapping && oldWidth != cm.display.scroller.clientWidth) {
+ forced = true;
+ continue;
+ }
+ forced = false;
+
+ // Clip forced viewport to actual scrollable area
+ if (viewPort)
+ viewPort = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight,
+ typeof viewPort == "number" ? viewPort : viewPort.top);
+ visible = visibleLines(cm.display, cm.doc, viewPort);
+ if (visible.from >= cm.display.showingFrom && visible.to <= cm.display.showingTo)
+ break;
+ }
+
+ if (updated) {
+ signalLater(cm, "update", cm);
+ if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo)
+ signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo);
+ }
+ return updated;
+ }
+
+ // Uses a set of changes plus the current scroll position to
+ // determine which DOM updates have to be made, and makes the
+ // updates.
+ function updateDisplayInner(cm, changes, visible, forced) {
+ var display = cm.display, doc = cm.doc;
+ if (!display.wrapper.clientWidth) {
+ display.showingFrom = display.showingTo = doc.first;
+ display.viewOffset = 0;
+ return;
+ }
+
+ // Bail out if the visible area is already rendered and nothing changed.
+ if (!forced && changes.length == 0 &&
+ visible.from > display.showingFrom && visible.to < display.showingTo)
+ return;
+
+ if (maybeUpdateLineNumberWidth(cm))
+ changes = [{from: doc.first, to: doc.first + doc.size}];
+ var gutterW = display.sizer.style.marginLeft = display.gutters.offsetWidth + "px";
+ display.scrollbarH.style.left = cm.options.fixedGutter ? gutterW : "0";
+
+ // Used to determine which lines need their line numbers updated
+ var positionsChangedFrom = Infinity;
+ if (cm.options.lineNumbers)
+ for (var i = 0; i < changes.length; ++i)
+ if (changes[i].diff && changes[i].from < positionsChangedFrom) { positionsChangedFrom = changes[i].from; }
+
+ var end = doc.first + doc.size;
+ var from = Math.max(visible.from - cm.options.viewportMargin, doc.first);
+ var to = Math.min(end, visible.to + cm.options.viewportMargin);
+ if (display.showingFrom < from && from - display.showingFrom < 20) from = Math.max(doc.first, display.showingFrom);
+ if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(end, display.showingTo);
+ if (sawCollapsedSpans) {
+ from = lineNo(visualLine(doc, getLine(doc, from)));
+ while (to < end && lineIsHidden(doc, getLine(doc, to))) ++to;
+ }
+
+ // Create a range of theoretically intact lines, and punch holes
+ // in that using the change info.
+ var intact = [{from: Math.max(display.showingFrom, doc.first),
+ to: Math.min(display.showingTo, end)}];
+ if (intact[0].from >= intact[0].to) intact = [];
+ else intact = computeIntact(intact, changes);
+ // When merged lines are present, we might have to reduce the
+ // intact ranges because changes in continued fragments of the
+ // intact lines do require the lines to be redrawn.
+ if (sawCollapsedSpans)
+ for (var i = 0; i < intact.length; ++i) {
+ var range = intact[i], merged;
+ while (merged = collapsedSpanAtEnd(getLine(doc, range.to - 1))) {
+ var newTo = merged.find().from.line;
+ if (newTo > range.from) range.to = newTo;
+ else { intact.splice(i--, 1); break; }
+ }
+ }
+
+ // Clip off the parts that won't be visible
+ var intactLines = 0;
+ for (var i = 0; i < intact.length; ++i) {
+ var range = intact[i];
+ if (range.from < from) range.from = from;
+ if (range.to > to) range.to = to;
+ if (range.from >= range.to) intact.splice(i--, 1);
+ else intactLines += range.to - range.from;
+ }
+ if (!forced && intactLines == to - from && from == display.showingFrom && to == display.showingTo) {
+ updateViewOffset(cm);
+ return;
+ }
+ intact.sort(function(a, b) {return a.from - b.from;});
+
+ // Avoid crashing on IE's "unspecified error" when in iframes
+ try {
+ var focused = document.activeElement;
+ } catch(e) {}
+ if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none";
+ patchDisplay(cm, from, to, intact, positionsChangedFrom);
+ display.lineDiv.style.display = "";
+ if (focused && document.activeElement != focused && focused.offsetHeight) focused.focus();
+
+ var different = from != display.showingFrom || to != display.showingTo ||
+ display.lastSizeC != display.wrapper.clientHeight;
+ // This is just a bogus formula that detects when the editor is
+ // resized or the font size changes.
+ if (different) {
+ display.lastSizeC = display.wrapper.clientHeight;
+ startWorker(cm, 400);
+ }
+ display.showingFrom = from; display.showingTo = to;
+
+ updateHeightsInViewport(cm);
+ updateViewOffset(cm);
+
+ return true;
+ }
+
+ function updateHeightsInViewport(cm) {
+ var display = cm.display;
+ var prevBottom = display.lineDiv.offsetTop;
+ for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) {
+ if (ie_lt8) {
+ var bot = node.offsetTop + node.offsetHeight;
+ height = bot - prevBottom;
+ prevBottom = bot;
+ } else {
+ var box = getRect(node);
+ height = box.bottom - box.top;
+ }
+ var diff = node.lineObj.height - height;
+ if (height < 2) height = textHeight(display);
+ if (diff > .001 || diff < -.001) {
+ updateLineHeight(node.lineObj, height);
+ var widgets = node.lineObj.widgets;
+ if (widgets) for (var i = 0; i < widgets.length; ++i)
+ widgets[i].height = widgets[i].node.offsetHeight;
+ }
+ }
+ }
+
+ function updateViewOffset(cm) {
+ var off = cm.display.viewOffset = heightAtLine(cm, getLine(cm.doc, cm.display.showingFrom));
+ // Position the mover div to align with the current virtual scroll position
+ cm.display.mover.style.top = off + "px";
+ }
+
+ function computeIntact(intact, changes) {
+ for (var i = 0, l = changes.length || 0; i < l; ++i) {
+ var change = changes[i], intact2 = [], diff = change.diff || 0;
+ for (var j = 0, l2 = intact.length; j < l2; ++j) {
+ var range = intact[j];
+ if (change.to <= range.from && change.diff) {
+ intact2.push({from: range.from + diff, to: range.to + diff});
+ } else if (change.to <= range.from || change.from >= range.to) {
+ intact2.push(range);
+ } else {
+ if (change.from > range.from)
+ intact2.push({from: range.from, to: change.from});
+ if (change.to < range.to)
+ intact2.push({from: change.to + diff, to: range.to + diff});
+ }
+ }
+ intact = intact2;
+ }
+ return intact;
+ }
+
+ function getDimensions(cm) {
+ var d = cm.display, left = {}, width = {};
+ for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
+ left[cm.options.gutters[i]] = n.offsetLeft;
+ width[cm.options.gutters[i]] = n.offsetWidth;
+ }
+ return {fixedPos: compensateForHScroll(d),
+ gutterTotalWidth: d.gutters.offsetWidth,
+ gutterLeft: left,
+ gutterWidth: width,
+ wrapperWidth: d.wrapper.clientWidth};
+ }
+
+ function patchDisplay(cm, from, to, intact, updateNumbersFrom) {
+ var dims = getDimensions(cm);
+ var display = cm.display, lineNumbers = cm.options.lineNumbers;
+ if (!intact.length && (!webkit || !cm.display.currentWheelTarget))
+ removeChildren(display.lineDiv);
+ var container = display.lineDiv, cur = container.firstChild;
+
+ function rm(node) {
+ var next = node.nextSibling;
+ if (webkit && mac && cm.display.currentWheelTarget == node) {
+ node.style.display = "none";
+ node.lineObj = null;
+ } else {
+ node.parentNode.removeChild(node);
+ }
+ return next;
+ }
+
+ var nextIntact = intact.shift(), lineN = from;
+ cm.doc.iter(from, to, function(line) {
+ if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift();
+ if (lineIsHidden(cm.doc, line)) {
+ if (line.height != 0) updateLineHeight(line, 0);
+ if (line.widgets && cur && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) {
+ var w = line.widgets[i];
+ if (w.showIfHidden) {
+ var prev = cur.previousSibling;
+ if (/pre/i.test(prev.nodeName)) {
+ var wrap = elt("div", null, null, "position: relative");
+ prev.parentNode.replaceChild(wrap, prev);
+ wrap.appendChild(prev);
+ prev = wrap;
+ }
+ var wnode = prev.appendChild(elt("div", [w.node], "CodeMirror-linewidget"));
+ if (!w.handleMouseEvents) wnode.ignoreEvents = true;
+ positionLineWidget(w, wnode, prev, dims);
+ }
+ }
+ } else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) {
+ // This line is intact. Skip to the actual node. Update its
+ // line number if needed.
+ while (cur.lineObj != line) cur = rm(cur);
+ if (lineNumbers && updateNumbersFrom <= lineN && cur.lineNumber)
+ setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineN));
+ cur = cur.nextSibling;
+ } else {
+ // For lines with widgets, make an attempt to find and reuse
+ // the existing element, so that widgets aren't needlessly
+ // removed and re-inserted into the dom
+ if (line.widgets) for (var j = 0, search = cur, reuse; search && j < 20; ++j, search = search.nextSibling)
+ if (search.lineObj == line && /div/i.test(search.nodeName)) { reuse = search; break; }
+ // This line needs to be generated.
+ var lineNode = buildLineElement(cm, line, lineN, dims, reuse);
+ if (lineNode != reuse) {
+ container.insertBefore(lineNode, cur);
+ } else {
+ while (cur != reuse) cur = rm(cur);
+ cur = cur.nextSibling;
+ }
+
+ lineNode.lineObj = line;
+ }
+ ++lineN;
+ });
+ while (cur) cur = rm(cur);
+ }
+
+ function buildLineElement(cm, line, lineNo, dims, reuse) {
+ var built = buildLineContent(cm, line), lineElement = built.pre;
+ var markers = line.gutterMarkers, display = cm.display, wrap;
+
+ var bgClass = built.bgClass ? built.bgClass + " " + (line.bgClass || "") : line.bgClass;
+ if (!cm.options.lineNumbers && !markers && !bgClass && !line.wrapClass && !line.widgets)
+ return lineElement;
+
+ // Lines with gutter elements, widgets or a background class need
+ // to be wrapped again, and have the extra elements added to the
+ // wrapper div
+
+ if (reuse) {
+ reuse.alignable = null;
+ var isOk = true, widgetsSeen = 0, insertBefore = null;
+ for (var n = reuse.firstChild, next; n; n = next) {
+ next = n.nextSibling;
+ if (!/\bCodeMirror-linewidget\b/.test(n.className)) {
+ reuse.removeChild(n);
+ } else {
+ for (var i = 0; i < line.widgets.length; ++i) {
+ var widget = line.widgets[i];
+ if (widget.node == n.firstChild) {
+ if (!widget.above && !insertBefore) insertBefore = n;
+ positionLineWidget(widget, n, reuse, dims);
+ ++widgetsSeen;
+ break;
+ }
+ }
+ if (i == line.widgets.length) { isOk = false; break; }
+ }
+ }
+ reuse.insertBefore(lineElement, insertBefore);
+ if (isOk && widgetsSeen == line.widgets.length) {
+ wrap = reuse;
+ reuse.className = line.wrapClass || "";
+ }
+ }
+ if (!wrap) {
+ wrap = elt("div", null, line.wrapClass, "position: relative");
+ wrap.appendChild(lineElement);
+ }
+ // Kludge to make sure the styled element lies behind the selection (by z-index)
+ if (bgClass)
+ wrap.insertBefore(elt("div", null, bgClass + " CodeMirror-linebackground"), wrap.firstChild);
+ if (cm.options.lineNumbers || markers) {
+ var gutterWrap = wrap.insertBefore(elt("div", null, null, "position: absolute; left: " +
+ (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"),
+ wrap.firstChild);
+ if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap);
+ if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
+ wrap.lineNumber = gutterWrap.appendChild(
+ elt("div", lineNumberFor(cm.options, lineNo),
+ "CodeMirror-linenumber CodeMirror-gutter-elt",
+ "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
+ + display.lineNumInnerWidth + "px"));
+ if (markers)
+ for (var k = 0; k < cm.options.gutters.length; ++k) {
+ var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
+ if (found)
+ gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
+ dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
+ }
+ }
+ if (ie_lt8) wrap.style.zIndex = 2;
+ if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
+ var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
+ if (!widget.handleMouseEvents) node.ignoreEvents = true;
+ positionLineWidget(widget, node, wrap, dims);
+ if (widget.above)
+ wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement);
+ else
+ wrap.appendChild(node);
+ signalLater(widget, "redraw");
+ }
+ return wrap;
+ }
+
+ function positionLineWidget(widget, node, wrap, dims) {
+ if (widget.noHScroll) {
+ (wrap.alignable || (wrap.alignable = [])).push(node);
+ var width = dims.wrapperWidth;
+ node.style.left = dims.fixedPos + "px";
+ if (!widget.coverGutter) {
+ width -= dims.gutterTotalWidth;
+ node.style.paddingLeft = dims.gutterTotalWidth + "px";
+ }
+ node.style.width = width + "px";
+ }
+ if (widget.coverGutter) {
+ node.style.zIndex = 5;
+ node.style.position = "relative";
+ if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
+ }
+ }
+
+ // SELECTION / CURSOR
+
+ function updateSelection(cm) {
+ var display = cm.display;
+ var collapsed = posEq(cm.doc.sel.from, cm.doc.sel.to);
+ if (collapsed || cm.options.showCursorWhenSelecting)
+ updateSelectionCursor(cm);
+ else
+ display.cursor.style.display = display.otherCursor.style.display = "none";
+ if (!collapsed)
+ updateSelectionRange(cm);
+ else
+ display.selectionDiv.style.display = "none";
+
+ // Move the hidden textarea near the cursor to prevent scrolling artifacts
+ if (cm.options.moveInputWithCursor) {
+ var headPos = cursorCoords(cm, cm.doc.sel.head, "div");
+ var wrapOff = getRect(display.wrapper), lineOff = getRect(display.lineDiv);
+ display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
+ headPos.top + lineOff.top - wrapOff.top)) + "px";
+ display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
+ headPos.left + lineOff.left - wrapOff.left)) + "px";
+ }
+ }
+
+ // No selection, plain cursor
+ function updateSelectionCursor(cm) {
+ var display = cm.display, pos = cursorCoords(cm, cm.doc.sel.head, "div");
+ display.cursor.style.left = pos.left + "px";
+ display.cursor.style.top = pos.top + "px";
+ display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
+ display.cursor.style.display = "";
+
+ if (pos.other) {
+ display.otherCursor.style.display = "";
+ display.otherCursor.style.left = pos.other.left + "px";
+ display.otherCursor.style.top = pos.other.top + "px";
+ display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
+ } else { display.otherCursor.style.display = "none"; }
+ }
+
+ // Highlight selection
+ function updateSelectionRange(cm) {
+ var display = cm.display, doc = cm.doc, sel = cm.doc.sel;
+ var fragment = document.createDocumentFragment();
+ var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display);
+
+ function add(left, top, width, bottom) {
+ if (top < 0) top = 0;
+ fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
+ "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) +
+ "px; height: " + (bottom - top) + "px"));
+ }
+
+ function drawForLine(line, fromArg, toArg) {
+ var lineObj = getLine(doc, line);
+ var lineLen = lineObj.text.length;
+ var start, end;
+ function coords(ch, bias) {
+ return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
+ }
+
+ iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
+ var leftPos = coords(from, "left"), rightPos, left, right;
+ if (from == to) {
+ rightPos = leftPos;
+ left = right = leftPos.left;
+ } else {
+ rightPos = coords(to - 1, "right");
+ if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
+ left = leftPos.left;
+ right = rightPos.right;
+ }
+ if (fromArg == null && from == 0) left = pl;
+ if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
+ add(left, leftPos.top, null, leftPos.bottom);
+ left = pl;
+ if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
+ }
+ if (toArg == null && to == lineLen) right = clientWidth;
+ if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
+ start = leftPos;
+ if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
+ end = rightPos;
+ if (left < pl + 1) left = pl;
+ add(left, rightPos.top, right - left, rightPos.bottom);
+ });
+ return {start: start, end: end};
+ }
+
+ if (sel.from.line == sel.to.line) {
+ drawForLine(sel.from.line, sel.from.ch, sel.to.ch);
+ } else {
+ var fromLine = getLine(doc, sel.from.line), toLine = getLine(doc, sel.to.line);
+ var singleVLine = visualLine(doc, fromLine) == visualLine(doc, toLine);
+ var leftEnd = drawForLine(sel.from.line, sel.from.ch, singleVLine ? fromLine.text.length : null).end;
+ var rightStart = drawForLine(sel.to.line, singleVLine ? 0 : null, sel.to.ch).start;
+ if (singleVLine) {
+ if (leftEnd.top < rightStart.top - 2) {
+ add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
+ add(pl, rightStart.top, rightStart.left, rightStart.bottom);
+ } else {
+ add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
+ }
+ }
+ if (leftEnd.bottom < rightStart.top)
+ add(pl, leftEnd.bottom, null, rightStart.top);
+ }
+
+ removeChildrenAndAdd(display.selectionDiv, fragment);
+ display.selectionDiv.style.display = "";
+ }
+
+ // Cursor-blinking
+ function restartBlink(cm) {
+ if (!cm.state.focused) return;
+ var display = cm.display;
+ clearInterval(display.blinker);
+ var on = true;
+ display.cursor.style.visibility = display.otherCursor.style.visibility = "";
+ if (cm.options.cursorBlinkRate > 0)
+ display.blinker = setInterval(function() {
+ display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden";
+ }, cm.options.cursorBlinkRate);
+ }
+
+ // HIGHLIGHT WORKER
+
+ function startWorker(cm, time) {
+ if (cm.doc.mode.startState && cm.doc.frontier < cm.display.showingTo)
+ cm.state.highlight.set(time, bind(highlightWorker, cm));
+ }
+
+ function highlightWorker(cm) {
+ var doc = cm.doc;
+ if (doc.frontier < doc.first) doc.frontier = doc.first;
+ if (doc.frontier >= cm.display.showingTo) return;
+ var end = +new Date + cm.options.workTime;
+ var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
+ var changed = [], prevChange;
+ doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.showingTo + 500), function(line) {
+ if (doc.frontier >= cm.display.showingFrom) { // Visible
+ var oldStyles = line.styles;
+ line.styles = highlightLine(cm, line, state);
+ var ischange = !oldStyles || oldStyles.length != line.styles.length;
+ for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
+ if (ischange) {
+ if (prevChange && prevChange.end == doc.frontier) prevChange.end++;
+ else changed.push(prevChange = {start: doc.frontier, end: doc.frontier + 1});
+ }
+ line.stateAfter = copyState(doc.mode, state);
+ } else {
+ processLine(cm, line, state);
+ line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
+ }
+ ++doc.frontier;
+ if (+new Date > end) {
+ startWorker(cm, cm.options.workDelay);
+ return true;
+ }
+ });
+ if (changed.length)
+ operation(cm, function() {
+ for (var i = 0; i < changed.length; ++i)
+ regChange(this, changed[i].start, changed[i].end);
+ })();
+ }
+
+ // Finds the line to start with when starting a parse. Tries to
+ // find a line with a stateAfter, so that it can start with a
+ // valid state. If that fails, it returns the line with the
+ // smallest indentation, which tends to need the least context to
+ // parse correctly.
+ function findStartLine(cm, n, precise) {
+ var minindent, minline, doc = cm.doc;
+ var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
+ for (var search = n; search > lim; --search) {
+ if (search <= doc.first) return doc.first;
+ var line = getLine(doc, search - 1);
+ if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
+ var indented = countColumn(line.text, null, cm.options.tabSize);
+ if (minline == null || minindent > indented) {
+ minline = search - 1;
+ minindent = indented;
+ }
+ }
+ return minline;
+ }
+
+ function getStateBefore(cm, n, precise) {
+ var doc = cm.doc, display = cm.display;
+ if (!doc.mode.startState) return true;
+ var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
+ if (!state) state = startState(doc.mode);
+ else state = copyState(doc.mode, state);
+ doc.iter(pos, n, function(line) {
+ processLine(cm, line, state);
+ var save = pos == n - 1 || pos % 5 == 0 || pos >= display.showingFrom && pos < display.showingTo;
+ line.stateAfter = save ? copyState(doc.mode, state) : null;
+ ++pos;
+ });
+ if (precise) doc.frontier = pos;
+ return state;
+ }
+
+ // POSITION MEASUREMENT
+
+ function paddingTop(display) {return display.lineSpace.offsetTop;}
+ function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
+ function paddingLeft(display) {
+ var e = removeChildrenAndAdd(display.measure, elt("pre", null, null, "text-align: left")).appendChild(elt("span", "x"));
+ return e.offsetLeft;
+ }
+
+ function measureChar(cm, line, ch, data, bias) {
+ var dir = -1;
+ data = data || measureLine(cm, line);
+ if (data.crude) {
+ var left = data.left + ch * data.width;
+ return {left: left, right: left + data.width, top: data.top, bottom: data.bottom};
+ }
+
+ for (var pos = ch;; pos += dir) {
+ var r = data[pos];
+ if (r) break;
+ if (dir < 0 && pos == 0) dir = 1;
+ }
+ bias = pos > ch ? "left" : pos < ch ? "right" : bias;
+ if (bias == "left" && r.leftSide) r = r.leftSide;
+ else if (bias == "right" && r.rightSide) r = r.rightSide;
+ return {left: pos < ch ? r.right : r.left,
+ right: pos > ch ? r.left : r.right,
+ top: r.top,
+ bottom: r.bottom};
+ }
+
+ function findCachedMeasurement(cm, line) {
+ var cache = cm.display.measureLineCache;
+ for (var i = 0; i < cache.length; ++i) {
+ var memo = cache[i];
+ if (memo.text == line.text && memo.markedSpans == line.markedSpans &&
+ cm.display.scroller.clientWidth == memo.width &&
+ memo.classes == line.textClass + "|" + line.wrapClass)
+ return memo;
+ }
+ }
+
+ function clearCachedMeasurement(cm, line) {
+ var exists = findCachedMeasurement(cm, line);
+ if (exists) exists.text = exists.measure = exists.markedSpans = null;
+ }
+
+ function measureLine(cm, line) {
+ // First look in the cache
+ var cached = findCachedMeasurement(cm, line);
+ if (cached) return cached.measure;
+
+ // Failing that, recompute and store result in cache
+ var measure = measureLineInner(cm, line);
+ var cache = cm.display.measureLineCache;
+ var memo = {text: line.text, width: cm.display.scroller.clientWidth,
+ markedSpans: line.markedSpans, measure: measure,
+ classes: line.textClass + "|" + line.wrapClass};
+ if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo;
+ else cache.push(memo);
+ return measure;
+ }
+
+ function measureLineInner(cm, line) {
+ if (!cm.options.lineWrapping && line.text.length >= cm.options.crudeMeasuringFrom)
+ return crudelyMeasureLine(cm, line);
+
+ var display = cm.display, measure = emptyArray(line.text.length);
+ var pre = buildLineContent(cm, line, measure, true).pre;
+
+ // IE does not cache element positions of inline elements between
+ // calls to getBoundingClientRect. This makes the loop below,
+ // which gathers the positions of all the characters on the line,
+ // do an amount of layout work quadratic to the number of
+ // characters. When line wrapping is off, we try to improve things
+ // by first subdividing the line into a bunch of inline blocks, so
+ // that IE can reuse most of the layout information from caches
+ // for those blocks. This does interfere with line wrapping, so it
+ // doesn't work when wrapping is on, but in that case the
+ // situation is slightly better, since IE does cache line-wrapping
+ // information and only recomputes per-line.
+ if (ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) {
+ var fragment = document.createDocumentFragment();
+ var chunk = 10, n = pre.childNodes.length;
+ for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) {
+ var wrap = elt("div", null, null, "display: inline-block");
+ for (var j = 0; j < chunk && n; ++j) {
+ wrap.appendChild(pre.firstChild);
+ --n;
+ }
+ fragment.appendChild(wrap);
+ }
+ pre.appendChild(fragment);
+ }
+
+ removeChildrenAndAdd(display.measure, pre);
+
+ var outer = getRect(display.lineDiv);
+ var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight;
+ // Work around an IE7/8 bug where it will sometimes have randomly
+ // replaced our pre with a clone at this point.
+ if (ie_lt9 && display.measure.first != pre)
+ removeChildrenAndAdd(display.measure, pre);
+
+ function measureRect(rect) {
+ var top = rect.top - outer.top, bot = rect.bottom - outer.top;
+ if (bot > maxBot) bot = maxBot;
+ if (top < 0) top = 0;
+ for (var i = vranges.length - 2; i >= 0; i -= 2) {
+ var rtop = vranges[i], rbot = vranges[i+1];
+ if (rtop > bot || rbot < top) continue;
+ if (rtop <= top && rbot >= bot ||
+ top <= rtop && bot >= rbot ||
+ Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) {
+ vranges[i] = Math.min(top, rtop);
+ vranges[i+1] = Math.max(bot, rbot);
+ break;
+ }
+ }
+ if (i < 0) { i = vranges.length; vranges.push(top, bot); }
+ return {left: rect.left - outer.left,
+ right: rect.right - outer.left,
+ top: i, bottom: null};
+ }
+ function finishRect(rect) {
+ rect.bottom = vranges[rect.top+1];
+ rect.top = vranges[rect.top];
+ }
+
+ for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) {
+ var node = cur, rect = null;
+ // A widget might wrap, needs special care
+ if (/\bCodeMirror-widget\b/.test(cur.className) && cur.getClientRects) {
+ if (cur.firstChild.nodeType == 1) node = cur.firstChild;
+ var rects = node.getClientRects();
+ if (rects.length > 1) {
+ rect = data[i] = measureRect(rects[0]);
+ rect.rightSide = measureRect(rects[rects.length - 1]);
+ }
+ }
+ if (!rect) rect = data[i] = measureRect(getRect(node));
+ if (cur.measureRight) rect.right = getRect(cur.measureRight).left;
+ if (cur.leftSide) rect.leftSide = measureRect(getRect(cur.leftSide));
+ }
+ removeChildren(cm.display.measure);
+ for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) {
+ finishRect(cur);
+ if (cur.leftSide) finishRect(cur.leftSide);
+ if (cur.rightSide) finishRect(cur.rightSide);
+ }
+ return data;
+ }
+
+ function crudelyMeasureLine(cm, line) {
+ var copy = new Line(line.text.slice(0, 100), null);
+ if (line.textClass) copy.textClass = line.textClass;
+ var measure = measureLineInner(cm, copy);
+ var left = measureChar(cm, copy, 0, measure, "left");
+ var right = measureChar(cm, copy, 99, measure, "right");
+ return {crude: true, top: left.top, left: left.left, bottom: left.bottom, width: (right.right - left.left) / 100};
+ }
+
+ function measureLineWidth(cm, line) {
+ var hasBadSpan = false;
+ if (line.markedSpans) for (var i = 0; i < line.markedSpans; ++i) {
+ var sp = line.markedSpans[i];
+ if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true;
+ }
+ var cached = !hasBadSpan && findCachedMeasurement(cm, line);
+ if (cached || line.text.length >= cm.options.crudeMeasuringFrom)
+ return measureChar(cm, line, line.text.length, cached && cached.measure, "right").right;
+
+ var pre = buildLineContent(cm, line, null, true).pre;
+ var end = pre.appendChild(zeroWidthElement(cm.display.measure));
+ removeChildrenAndAdd(cm.display.measure, pre);
+ return getRect(end).right - getRect(cm.display.lineDiv).left;
+ }
+
+ function clearCaches(cm) {
+ cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0;
+ cm.display.cachedCharWidth = cm.display.cachedTextHeight = null;
+ if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
+ cm.display.lineNumChars = null;
+ }
+
+ function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
+ function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
+
+ // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page"
+ function intoCoordSystem(cm, lineObj, rect, context) {
+ if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
+ var size = widgetHeight(lineObj.widgets[i]);
+ rect.top += size; rect.bottom += size;
+ }
+ if (context == "line") return rect;
+ if (!context) context = "local";
+ var yOff = heightAtLine(cm, lineObj);
+ if (context == "local") yOff += paddingTop(cm.display);
+ else yOff -= cm.display.viewOffset;
+ if (context == "page" || context == "window") {
+ var lOff = getRect(cm.display.lineSpace);
+ yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
+ var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
+ rect.left += xOff; rect.right += xOff;
+ }
+ rect.top += yOff; rect.bottom += yOff;
+ return rect;
+ }
+
+ // Context may be "window", "page", "div", or "local"/null
+ // Result is in "div" coords
+ function fromCoordSystem(cm, coords, context) {
+ if (context == "div") return coords;
+ var left = coords.left, top = coords.top;
+ // First move into "page" coordinate system
+ if (context == "page") {
+ left -= pageScrollX();
+ top -= pageScrollY();
+ } else if (context == "local" || !context) {
+ var localBox = getRect(cm.display.sizer);
+ left += localBox.left;
+ top += localBox.top;
+ }
+
+ var lineSpaceBox = getRect(cm.display.lineSpace);
+ return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
+ }
+
+ function charCoords(cm, pos, context, lineObj, bias) {
+ if (!lineObj) lineObj = getLine(cm.doc, pos.line);
+ return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, null, bias), context);
+ }
+
+ function cursorCoords(cm, pos, context, lineObj, measurement) {
+ lineObj = lineObj || getLine(cm.doc, pos.line);
+ if (!measurement) measurement = measureLine(cm, lineObj);
+ function get(ch, right) {
+ var m = measureChar(cm, lineObj, ch, measurement, right ? "right" : "left");
+ if (right) m.left = m.right; else m.right = m.left;
+ return intoCoordSystem(cm, lineObj, m, context);
+ }
+ function getBidi(ch, partPos) {
+ var part = order[partPos], right = part.level % 2;
+ if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
+ part = order[--partPos];
+ ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
+ right = true;
+ } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
+ part = order[++partPos];
+ ch = bidiLeft(part) - part.level % 2;
+ right = false;
+ }
+ if (right && ch == part.to && ch > part.from) return get(ch - 1);
+ return get(ch, right);
+ }
+ var order = getOrder(lineObj), ch = pos.ch;
+ if (!order) return get(ch);
+ var partPos = getBidiPartAt(order, ch);
+ var val = getBidi(ch, partPos);
+ if (bidiOther != null) val.other = getBidi(ch, bidiOther);
+ return val;
+ }
+
+ function PosWithInfo(line, ch, outside, xRel) {
+ var pos = new Pos(line, ch);
+ pos.xRel = xRel;
+ if (outside) pos.outside = true;
+ return pos;
+ }
+
+ // Coords must be lineSpace-local
+ function coordsChar(cm, x, y) {
+ var doc = cm.doc;
+ y += cm.display.viewOffset;
+ if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
+ var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
+ if (lineNo > last)
+ return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
+ if (x < 0) x = 0;
+
+ for (;;) {
+ var lineObj = getLine(doc, lineNo);
+ var found = coordsCharInner(cm, lineObj, lineNo, x, y);
+ var merged = collapsedSpanAtEnd(lineObj);
+ var mergedPos = merged && merged.find();
+ if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
+ lineNo = mergedPos.to.line;
+ else
+ return found;
+ }
+ }
+
+ function coordsCharInner(cm, lineObj, lineNo, x, y) {
+ var innerOff = y - heightAtLine(cm, lineObj);
+ var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
+ var measurement = measureLine(cm, lineObj);
+
+ function getX(ch) {
+ var sp = cursorCoords(cm, Pos(lineNo, ch), "line",
+ lineObj, measurement);
+ wrongLine = true;
+ if (innerOff > sp.bottom) return sp.left - adjust;
+ else if (innerOff < sp.top) return sp.left + adjust;
+ else wrongLine = false;
+ return sp.left;
+ }
+
+ var bidi = getOrder(lineObj), dist = lineObj.text.length;
+ var from = lineLeft(lineObj), to = lineRight(lineObj);
+ var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
+
+ if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
+ // Do a binary search between these bounds.
+ for (;;) {
+ if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
+ var ch = x < fromX || x - fromX <= toX - x ? from : to;
+ var xDiff = x - (ch == from ? fromX : toX);
+ while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch;
+ var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
+ xDiff < 0 ? -1 : xDiff ? 1 : 0);
+ return pos;
+ }
+ var step = Math.ceil(dist / 2), middle = from + step;
+ if (bidi) {
+ middle = from;
+ for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
+ }
+ var middleX = getX(middle);
+ if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
+ else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
+ }
+ }
+
+ var measureText;
+ function textHeight(display) {
+ if (display.cachedTextHeight != null) return display.cachedTextHeight;
+ if (measureText == null) {
+ measureText = elt("pre");
+ // Measure a bunch of lines, for browsers that compute
+ // fractional heights.
+ for (var i = 0; i < 49; ++i) {
+ measureText.appendChild(document.createTextNode("x"));
+ measureText.appendChild(elt("br"));
+ }
+ measureText.appendChild(document.createTextNode("x"));
+ }
+ removeChildrenAndAdd(display.measure, measureText);
+ var height = measureText.offsetHeight / 50;
+ if (height > 3) display.cachedTextHeight = height;
+ removeChildren(display.measure);
+ return height || 1;
+ }
+
+ function charWidth(display) {
+ if (display.cachedCharWidth != null) return display.cachedCharWidth;
+ var anchor = elt("span", "x");
+ var pre = elt("pre", [anchor]);
+ removeChildrenAndAdd(display.measure, pre);
+ var width = anchor.offsetWidth;
+ if (width > 2) display.cachedCharWidth = width;
+ return width || 10;
+ }
+
+ // OPERATIONS
+
+ // Operations are used to wrap changes in such a way that each
+ // change won't have to update the cursor and display (which would
+ // be awkward, slow, and error-prone), but instead updates are
+ // batched and then all combined and executed at once.
+
+ var nextOpId = 0;
+ function startOperation(cm) {
+ cm.curOp = {
+ // An array of ranges of lines that have to be updated. See
+ // updateDisplay.
+ changes: [],
+ forceUpdate: false,
+ updateInput: null,
+ userSelChange: null,
+ textChanged: null,
+ selectionChanged: false,
+ cursorActivity: false,
+ updateMaxLine: false,
+ updateScrollPos: false,
+ id: ++nextOpId
+ };
+ if (!delayedCallbackDepth++) delayedCallbacks = [];
+ }
+
+ function endOperation(cm) {
+ var op = cm.curOp, doc = cm.doc, display = cm.display;
+ cm.curOp = null;
+
+ if (op.updateMaxLine) computeMaxLength(cm);
+ if (display.maxLineChanged && !cm.options.lineWrapping && display.maxLine) {
+ var width = measureLineWidth(cm, display.maxLine);
+ display.sizer.style.minWidth = Math.max(0, width + 3 + scrollerCutOff) + "px";
+ display.maxLineChanged = false;
+ var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth);
+ if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos)
+ setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true);
+ }
+ var newScrollPos, updated;
+ if (op.updateScrollPos) {
+ newScrollPos = op.updateScrollPos;
+ } else if (op.selectionChanged && display.scroller.clientHeight) { // don't rescroll if not visible
+ var coords = cursorCoords(cm, doc.sel.head);
+ newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom);
+ }
+ if (op.changes.length || op.forceUpdate || newScrollPos && newScrollPos.scrollTop != null) {
+ updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop, op.forceUpdate);
+ if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop;
+ }
+ if (!updated && op.selectionChanged) updateSelection(cm);
+ if (op.updateScrollPos) {
+ display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = newScrollPos.scrollTop;
+ display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = newScrollPos.scrollLeft;
+ alignHorizontally(cm);
+ if (op.scrollToPos)
+ scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos.from),
+ clipPos(cm.doc, op.scrollToPos.to), op.scrollToPos.margin);
+ } else if (newScrollPos) {
+ scrollCursorIntoView(cm);
+ }
+ if (op.selectionChanged) restartBlink(cm);
+
+ if (cm.state.focused && op.updateInput)
+ resetInput(cm, op.userSelChange);
+
+ var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
+ if (hidden) for (var i = 0; i < hidden.length; ++i)
+ if (!hidden[i].lines.length) signal(hidden[i], "hide");
+ if (unhidden) for (var i = 0; i < unhidden.length; ++i)
+ if (unhidden[i].lines.length) signal(unhidden[i], "unhide");
+
+ var delayed;
+ if (!--delayedCallbackDepth) {
+ delayed = delayedCallbacks;
+ delayedCallbacks = null;
+ }
+ if (op.textChanged)
+ signal(cm, "change", cm, op.textChanged);
+ if (op.cursorActivity) signal(cm, "cursorActivity", cm);
+ if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();
+ }
+
+ // Wraps a function in an operation. Returns the wrapped function.
+ function operation(cm1, f) {
+ return function() {
+ var cm = cm1 || this, withOp = !cm.curOp;
+ if (withOp) startOperation(cm);
+ try { var result = f.apply(cm, arguments); }
+ finally { if (withOp) endOperation(cm); }
+ return result;
+ };
+ }
+ function docOperation(f) {
+ return function() {
+ var withOp = this.cm && !this.cm.curOp, result;
+ if (withOp) startOperation(this.cm);
+ try { result = f.apply(this, arguments); }
+ finally { if (withOp) endOperation(this.cm); }
+ return result;
+ };
+ }
+ function runInOp(cm, f) {
+ var withOp = !cm.curOp, result;
+ if (withOp) startOperation(cm);
+ try { result = f(); }
+ finally { if (withOp) endOperation(cm); }
+ return result;
+ }
+
+ function regChange(cm, from, to, lendiff) {
+ if (from == null) from = cm.doc.first;
+ if (to == null) to = cm.doc.first + cm.doc.size;
+ cm.curOp.changes.push({from: from, to: to, diff: lendiff});
+ }
+
+ // INPUT HANDLING
+
+ function slowPoll(cm) {
+ if (cm.display.pollingFast) return;
+ cm.display.poll.set(cm.options.pollInterval, function() {
+ readInput(cm);
+ if (cm.state.focused) slowPoll(cm);
+ });
+ }
+
+ function fastPoll(cm) {
+ var missed = false;
+ cm.display.pollingFast = true;
+ function p() {
+ var changed = readInput(cm);
+ if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}
+ else {cm.display.pollingFast = false; slowPoll(cm);}
+ }
+ cm.display.poll.set(20, p);
+ }
+
+ // prevInput is a hack to work with IME. If we reset the textarea
+ // on every change, that breaks IME. So we look for changes
+ // compared to the previous content instead. (Modern browsers have
+ // events that indicate IME taking place, but these are not widely
+ // supported or compatible enough yet to rely on.)
+ function readInput(cm) {
+ var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel;
+ if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.state.disableInput) return false;
+ if (cm.state.pasteIncoming && cm.state.fakedLastChar) {
+ input.value = input.value.substring(0, input.value.length - 1);
+ cm.state.fakedLastChar = false;
+ }
+ var text = input.value;
+ if (text == prevInput && posEq(sel.from, sel.to)) return false;
+ if (ie && !ie_lt9 && cm.display.inputHasSelection === text) {
+ resetInput(cm, true);
+ return false;
+ }
+
+ var withOp = !cm.curOp;
+ if (withOp) startOperation(cm);
+ sel.shift = false;
+ var same = 0, l = Math.min(prevInput.length, text.length);
+ while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
+ var from = sel.from, to = sel.to;
+ if (same < prevInput.length)
+ from = Pos(from.line, from.ch - (prevInput.length - same));
+ else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming)
+ to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + (text.length - same)));
+
+ var updateInput = cm.curOp.updateInput;
+ var changeEvent = {from: from, to: to, text: splitLines(text.slice(same)),
+ origin: cm.state.pasteIncoming ? "paste" : "+input"};
+ makeChange(cm.doc, changeEvent, "end");
+ cm.curOp.updateInput = updateInput;
+ signalLater(cm, "inputRead", cm, changeEvent);
+
+ if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";
+ else cm.display.prevInput = text;
+ if (withOp) endOperation(cm);
+ cm.state.pasteIncoming = false;
+ return true;
+ }
+
+ function resetInput(cm, user) {
+ var minimal, selected, doc = cm.doc;
+ if (!posEq(doc.sel.from, doc.sel.to)) {
+ cm.display.prevInput = "";
+ minimal = hasCopyEvent &&
+ (doc.sel.to.line - doc.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000);
+ var content = minimal ? "-" : selected || cm.getSelection();
+ cm.display.input.value = content;
+ if (cm.state.focused) selectInput(cm.display.input);
+ if (ie && !ie_lt9) cm.display.inputHasSelection = content;
+ } else if (user) {
+ cm.display.prevInput = cm.display.input.value = "";
+ if (ie && !ie_lt9) cm.display.inputHasSelection = null;
+ }
+ cm.display.inaccurateSelection = minimal;
+ }
+
+ function focusInput(cm) {
+ if (cm.options.readOnly != "nocursor" && (!mobile || document.activeElement != cm.display.input))
+ cm.display.input.focus();
+ }
+
+ function isReadOnly(cm) {
+ return cm.options.readOnly || cm.doc.cantEdit;
+ }
+
+ // EVENT HANDLERS
+
+ function registerEventHandlers(cm) {
+ var d = cm.display;
+ on(d.scroller, "mousedown", operation(cm, onMouseDown));
+ if (ie)
+ on(d.scroller, "dblclick", operation(cm, function(e) {
+ if (signalDOMEvent(cm, e)) return;
+ var pos = posFromMouse(cm, e);
+ if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
+ e_preventDefault(e);
+ var word = findWordAt(getLine(cm.doc, pos.line).text, pos);
+ extendSelection(cm.doc, word.from, word.to);
+ }));
+ else
+ on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
+ on(d.lineSpace, "selectstart", function(e) {
+ if (!eventInWidget(d, e)) e_preventDefault(e);
+ });
+ // Gecko browsers fire contextmenu *after* opening the menu, at
+ // which point we can't mess with it anymore. Context menu is
+ // handled in onMouseDown for Gecko.
+ if (!captureMiddleClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});
+
+ on(d.scroller, "scroll", function() {
+ if (d.scroller.clientHeight) {
+ setScrollTop(cm, d.scroller.scrollTop);
+ setScrollLeft(cm, d.scroller.scrollLeft, true);
+ signal(cm, "scroll", cm);
+ }
+ });
+ on(d.scrollbarV, "scroll", function() {
+ if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop);
+ });
+ on(d.scrollbarH, "scroll", function() {
+ if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft);
+ });
+
+ on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
+ on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});
+
+ function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); }
+ on(d.scrollbarH, "mousedown", reFocus);
+ on(d.scrollbarV, "mousedown", reFocus);
+ // Prevent wrapper from ever scrolling
+ on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
+
+ var resizeTimer;
+ function onResize() {
+ if (resizeTimer == null) resizeTimer = setTimeout(function() {
+ resizeTimer = null;
+ // Might be a text scaling operation, clear size caches.
+ d.cachedCharWidth = d.cachedTextHeight = knownScrollbarWidth = null;
+ clearCaches(cm);
+ runInOp(cm, bind(regChange, cm));
+ }, 100);
+ }
+ on(window, "resize", onResize);
+ // Above handler holds on to the editor and its data structures.
+ // Here we poll to unregister it when the editor is no longer in
+ // the document, so that it can be garbage-collected.
+ function unregister() {
+ for (var p = d.wrapper.parentNode; p && p != document.body; p = p.parentNode) {}
+ if (p) setTimeout(unregister, 5000);
+ else off(window, "resize", onResize);
+ }
+ setTimeout(unregister, 5000);
+
+ on(d.input, "keyup", operation(cm, function(e) {
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
+ if (e.keyCode == 16) cm.doc.sel.shift = false;
+ }));
+ on(d.input, "input", function() {
+ if (ie && !ie_lt9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;
+ fastPoll(cm);
+ });
+ on(d.input, "keydown", operation(cm, onKeyDown));
+ on(d.input, "keypress", operation(cm, onKeyPress));
+ on(d.input, "focus", bind(onFocus, cm));
+ on(d.input, "blur", bind(onBlur, cm));
+
+ function drag_(e) {
+ if (signalDOMEvent(cm, e) || cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return;
+ e_stop(e);
+ }
+ if (cm.options.dragDrop) {
+ on(d.scroller, "dragstart", function(e){onDragStart(cm, e);});
+ on(d.scroller, "dragenter", drag_);
+ on(d.scroller, "dragover", drag_);
+ on(d.scroller, "drop", operation(cm, onDrop));
+ }
+ on(d.scroller, "paste", function(e) {
+ if (eventInWidget(d, e)) return;
+ focusInput(cm);
+ fastPoll(cm);
+ });
+ on(d.input, "paste", function() {
+ // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206
+ // Add a char to the end of textarea before paste occur so that
+ // selection doesn't span to the end of textarea.
+ if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {
+ var start = d.input.selectionStart, end = d.input.selectionEnd;
+ d.input.value += "$";
+ d.input.selectionStart = start;
+ d.input.selectionEnd = end;
+ cm.state.fakedLastChar = true;
+ }
+ cm.state.pasteIncoming = true;
+ fastPoll(cm);
+ });
+
+ function prepareCopy() {
+ if (d.inaccurateSelection) {
+ d.prevInput = "";
+ d.inaccurateSelection = false;
+ d.input.value = cm.getSelection();
+ selectInput(d.input);
+ }
+ }
+ on(d.input, "cut", prepareCopy);
+ on(d.input, "copy", prepareCopy);
+
+ // Needed to handle Tab key in KHTML
+ if (khtml) on(d.sizer, "mouseup", function() {
+ if (document.activeElement == d.input) d.input.blur();
+ focusInput(cm);
+ });
+ }
+
+ function eventInWidget(display, e) {
+ for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
+ if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;
+ }
+ }
+
+ function posFromMouse(cm, e, liberal) {
+ var display = cm.display;
+ if (!liberal) {
+ var target = e_target(e);
+ if (target == display.scrollbarH || target == display.scrollbarH.firstChild ||
+ target == display.scrollbarV || target == display.scrollbarV.firstChild ||
+ target == display.scrollbarFiller || target == display.gutterFiller) return null;
+ }
+ var x, y, space = getRect(display.lineSpace);
+ // Fails unpredictably on IE[67] when mouse is dragged around quickly.
+ try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
+ return coordsChar(cm, x - space.left, y - space.top);
+ }
+
+ var lastClick, lastDoubleClick;
+ function onMouseDown(e) {
+ if (signalDOMEvent(this, e)) return;
+ var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel;
+ sel.shift = e.shiftKey;
+
+ if (eventInWidget(display, e)) {
+ if (!webkit) {
+ display.scroller.draggable = false;
+ setTimeout(function(){display.scroller.draggable = true;}, 100);
+ }
+ return;
+ }
+ if (clickInGutter(cm, e)) return;
+ var start = posFromMouse(cm, e);
+
+ switch (e_button(e)) {
+ case 3:
+ if (captureMiddleClick) onContextMenu.call(cm, cm, e);
+ return;
+ case 2:
+ if (webkit) cm.state.lastMiddleDown = +new Date;
+ if (start) extendSelection(cm.doc, start);
+ setTimeout(bind(focusInput, cm), 20);
+ e_preventDefault(e);
+ return;
+ }
+ // For button 1, if it was clicked inside the editor
+ // (posFromMouse returning non-null), we have to adjust the
+ // selection.
+ if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;}
+
+ if (!cm.state.focused) onFocus(cm);
+
+ var now = +new Date, type = "single";
+ if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
+ type = "triple";
+ e_preventDefault(e);
+ setTimeout(bind(focusInput, cm), 20);
+ selectLine(cm, start.line);
+ } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
+ type = "double";
+ lastDoubleClick = {time: now, pos: start};
+ e_preventDefault(e);
+ var word = findWordAt(getLine(doc, start.line).text, start);
+ extendSelection(cm.doc, word.from, word.to);
+ } else { lastClick = {time: now, pos: start}; }
+
+ var last = start;
+ if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) &&
+ !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") {
+ var dragEnd = operation(cm, function(e2) {
+ if (webkit) display.scroller.draggable = false;
+ cm.state.draggingText = false;
+ off(document, "mouseup", dragEnd);
+ off(display.scroller, "drop", dragEnd);
+ if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
+ e_preventDefault(e2);
+ extendSelection(cm.doc, start);
+ focusInput(cm);
+ }
+ });
+ // Let the drag handler handle this.
+ if (webkit) display.scroller.draggable = true;
+ cm.state.draggingText = dragEnd;
+ // IE's approach to draggable
+ if (display.scroller.dragDrop) display.scroller.dragDrop();
+ on(document, "mouseup", dragEnd);
+ on(display.scroller, "drop", dragEnd);
+ return;
+ }
+ e_preventDefault(e);
+ if (type == "single") extendSelection(cm.doc, clipPos(doc, start));
+
+ var startstart = sel.from, startend = sel.to, lastPos = start;
+
+ function doSelect(cur) {
+ if (posEq(lastPos, cur)) return;
+ lastPos = cur;
+
+ if (type == "single") {
+ extendSelection(cm.doc, clipPos(doc, start), cur);
+ return;
+ }
+
+ startstart = clipPos(doc, startstart);
+ startend = clipPos(doc, startend);
+ if (type == "double") {
+ var word = findWordAt(getLine(doc, cur.line).text, cur);
+ if (posLess(cur, startstart)) extendSelection(cm.doc, word.from, startend);
+ else extendSelection(cm.doc, startstart, word.to);
+ } else if (type == "triple") {
+ if (posLess(cur, startstart)) extendSelection(cm.doc, startend, clipPos(doc, Pos(cur.line, 0)));
+ else extendSelection(cm.doc, startstart, clipPos(doc, Pos(cur.line + 1, 0)));
+ }
+ }
+
+ var editorSize = getRect(display.wrapper);
+ // Used to ensure timeout re-tries don't fire when another extend
+ // happened in the meantime (clearTimeout isn't reliable -- at
+ // least on Chrome, the timeouts still happen even when cleared,
+ // if the clear happens after their scheduled firing time).
+ var counter = 0;
+
+ function extend(e) {
+ var curCount = ++counter;
+ var cur = posFromMouse(cm, e, true);
+ if (!cur) return;
+ if (!posEq(cur, last)) {
+ if (!cm.state.focused) onFocus(cm);
+ last = cur;
+ doSelect(cur);
+ var visible = visibleLines(display, doc);
+ if (cur.line >= visible.to || cur.line < visible.from)
+ setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
+ } else {
+ var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
+ if (outside) setTimeout(operation(cm, function() {
+ if (counter != curCount) return;
+ display.scroller.scrollTop += outside;
+ extend(e);
+ }), 50);
+ }
+ }
+
+ function done(e) {
+ counter = Infinity;
+ e_preventDefault(e);
+ focusInput(cm);
+ off(document, "mousemove", move);
+ off(document, "mouseup", up);
+ }
+
+ var move = operation(cm, function(e) {
+ if (!ie && !e_button(e)) done(e);
+ else extend(e);
+ });
+ var up = operation(cm, done);
+ on(document, "mousemove", move);
+ on(document, "mouseup", up);
+ }
+
+ function gutterEvent(cm, e, type, prevent, signalfn) {
+ try { var mX = e.clientX, mY = e.clientY; }
+ catch(e) { return false; }
+ if (mX >= Math.floor(getRect(cm.display.gutters).right)) return false;
+ if (prevent) e_preventDefault(e);
+
+ var display = cm.display;
+ var lineBox = getRect(display.lineDiv);
+
+ if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);
+ mY -= lineBox.top - display.viewOffset;
+
+ for (var i = 0; i < cm.options.gutters.length; ++i) {
+ var g = display.gutters.childNodes[i];
+ if (g && getRect(g).right >= mX) {
+ var line = lineAtHeight(cm.doc, mY);
+ var gutter = cm.options.gutters[i];
+ signalfn(cm, type, cm, line, gutter, e);
+ return e_defaultPrevented(e);
+ }
+ }
+ }
+
+ function contextMenuInGutter(cm, e) {
+ if (!hasHandler(cm, "gutterContextMenu")) return false;
+ return gutterEvent(cm, e, "gutterContextMenu", false, signal);
+ }
+
+ function clickInGutter(cm, e) {
+ return gutterEvent(cm, e, "gutterClick", true, signalLater);
+ }
+
+ // Kludge to work around strange IE behavior where it'll sometimes
+ // re-fire a series of drag-related events right after the drop (#1551)
+ var lastDrop = 0;
+
+ function onDrop(e) {
+ var cm = this;
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))))
+ return;
+ e_preventDefault(e);
+ if (ie) lastDrop = +new Date;
+ var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
+ if (!pos || isReadOnly(cm)) return;
+ if (files && files.length && window.FileReader && window.File) {
+ var n = files.length, text = Array(n), read = 0;
+ var loadFile = function(file, i) {
+ var reader = new FileReader;
+ reader.onload = function() {
+ text[i] = reader.result;
+ if (++read == n) {
+ pos = clipPos(cm.doc, pos);
+ makeChange(cm.doc, {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"}, "around");
+ }
+ };
+ reader.readAsText(file);
+ };
+ for (var i = 0; i < n; ++i) loadFile(files[i], i);
+ } else {
+ // Don't do a replace if the drop happened inside of the selected text.
+ if (cm.state.draggingText && !(posLess(pos, cm.doc.sel.from) || posLess(cm.doc.sel.to, pos))) {
+ cm.state.draggingText(e);
+ // Ensure the editor is re-focused
+ setTimeout(bind(focusInput, cm), 20);
+ return;
+ }
+ try {
+ var text = e.dataTransfer.getData("Text");
+ if (text) {
+ var curFrom = cm.doc.sel.from, curTo = cm.doc.sel.to;
+ setSelection(cm.doc, pos, pos);
+ if (cm.state.draggingText) replaceRange(cm.doc, "", curFrom, curTo, "paste");
+ cm.replaceSelection(text, null, "paste");
+ focusInput(cm);
+ onFocus(cm);
+ }
+ }
+ catch(e){}
+ }
+ }
+
+ function onDragStart(cm, e) {
+ if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
+
+ var txt = cm.getSelection();
+ e.dataTransfer.setData("Text", txt);
+
+ // Use dummy image instead of default browsers image.
+ // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
+ if (e.dataTransfer.setDragImage && !safari) {
+ var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
+ img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
+ if (opera) {
+ img.width = img.height = 1;
+ cm.display.wrapper.appendChild(img);
+ // Force a relayout, or Opera won't use our image for some obscure reason
+ img._top = img.offsetTop;
+ }
+ e.dataTransfer.setDragImage(img, 0, 0);
+ if (opera) img.parentNode.removeChild(img);
+ }
+ }
+
+ function setScrollTop(cm, val) {
+ if (Math.abs(cm.doc.scrollTop - val) < 2) return;
+ cm.doc.scrollTop = val;
+ if (!gecko) updateDisplay(cm, [], val);
+ if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
+ if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;
+ if (gecko) updateDisplay(cm, []);
+ startWorker(cm, 100);
+ }
+ function setScrollLeft(cm, val, isScroller) {
+ if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
+ val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
+ cm.doc.scrollLeft = val;
+ alignHorizontally(cm);
+ if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
+ if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val;
+ }
+
+ // Since the delta values reported on mouse wheel events are
+ // unstandardized between browsers and even browser versions, and
+ // generally horribly unpredictable, this code starts by measuring
+ // the scroll effect that the first few mouse wheel events have,
+ // and, from that, detects the way it can convert deltas to pixel
+ // offsets afterwards.
+ //
+ // The reason we want to know the amount a wheel event will scroll
+ // is that it gives us a chance to update the display before the
+ // actual scrolling happens, reducing flickering.
+
+ var wheelSamples = 0, wheelPixelsPerUnit = null;
+ // Fill in a browser-detected starting value on browsers where we
+ // know one. These don't have to be accurate -- the result of them
+ // being wrong would just be a slight flicker on the first wheel
+ // scroll (if it is large enough).
+ if (ie) wheelPixelsPerUnit = -.53;
+ else if (gecko) wheelPixelsPerUnit = 15;
+ else if (chrome) wheelPixelsPerUnit = -.7;
+ else if (safari) wheelPixelsPerUnit = -1/3;
+
+ function onScrollWheel(cm, e) {
+ var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
+ if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
+ if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
+ else if (dy == null) dy = e.wheelDelta;
+
+ var display = cm.display, scroll = display.scroller;
+ // Quit if there's nothing to scroll here
+ if (!(dx && scroll.scrollWidth > scroll.clientWidth ||
+ dy && scroll.scrollHeight > scroll.clientHeight)) return;
+
+ // Webkit browsers on OS X abort momentum scrolls when the target
+ // of the scroll event is removed from the scrollable element.
+ // This hack (see related code in patchDisplay) makes sure the
+ // element is kept around.
+ if (dy && mac && webkit) {
+ for (var cur = e.target; cur != scroll; cur = cur.parentNode) {
+ if (cur.lineObj) {
+ cm.display.currentWheelTarget = cur;
+ break;
+ }
+ }
+ }
+
+ // On some browsers, horizontal scrolling will cause redraws to
+ // happen before the gutter has been realigned, causing it to
+ // wriggle around in a most unseemly way. When we have an
+ // estimated pixels/delta value, we just handle horizontal
+ // scrolling entirely here. It'll be slightly off from native, but
+ // better than glitching out.
+ if (dx && !gecko && !opera && wheelPixelsPerUnit != null) {
+ if (dy)
+ setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
+ setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
+ e_preventDefault(e);
+ display.wheelStartX = null; // Abort measurement, if in progress
+ return;
+ }
+
+ if (dy && wheelPixelsPerUnit != null) {
+ var pixels = dy * wheelPixelsPerUnit;
+ var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
+ if (pixels < 0) top = Math.max(0, top + pixels - 50);
+ else bot = Math.min(cm.doc.height, bot + pixels + 50);
+ updateDisplay(cm, [], {top: top, bottom: bot});
+ }
+
+ if (wheelSamples < 20) {
+ if (display.wheelStartX == null) {
+ display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
+ display.wheelDX = dx; display.wheelDY = dy;
+ setTimeout(function() {
+ if (display.wheelStartX == null) return;
+ var movedX = scroll.scrollLeft - display.wheelStartX;
+ var movedY = scroll.scrollTop - display.wheelStartY;
+ var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
+ (movedX && display.wheelDX && movedX / display.wheelDX);
+ display.wheelStartX = display.wheelStartY = null;
+ if (!sample) return;
+ wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
+ ++wheelSamples;
+ }, 200);
+ } else {
+ display.wheelDX += dx; display.wheelDY += dy;
+ }
+ }
+ }
+
+ function doHandleBinding(cm, bound, dropShift) {
+ if (typeof bound == "string") {
+ bound = commands[bound];
+ if (!bound) return false;
+ }
+ // Ensure previous input has been read, so that the handler sees a
+ // consistent view of the document
+ if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;
+ var doc = cm.doc, prevShift = doc.sel.shift, done = false;
+ try {
+ if (isReadOnly(cm)) cm.state.suppressEdits = true;
+ if (dropShift) doc.sel.shift = false;
+ done = bound(cm) != Pass;
+ } finally {
+ doc.sel.shift = prevShift;
+ cm.state.suppressEdits = false;
+ }
+ return done;
+ }
+
+ function allKeyMaps(cm) {
+ var maps = cm.state.keyMaps.slice(0);
+ if (cm.options.extraKeys) maps.push(cm.options.extraKeys);
+ maps.push(cm.options.keyMap);
+ return maps;
+ }
+
+ var maybeTransition;
+ function handleKeyBinding(cm, e) {
+ // Handle auto keymap transitions
+ var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;
+ clearTimeout(maybeTransition);
+ if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
+ if (getKeyMap(cm.options.keyMap) == startMap) {
+ cm.options.keyMap = (next.call ? next.call(null, cm) : next);
+ keyMapChanged(cm);
+ }
+ }, 50);
+
+ var name = keyName(e, true), handled = false;
+ if (!name) return false;
+ var keymaps = allKeyMaps(cm);
+
+ if (e.shiftKey) {
+ // First try to resolve full name (including 'Shift-'). Failing
+ // that, see if there is a cursor-motion command (starting with
+ // 'go') bound to the keyname without 'Shift-'.
+ handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})
+ || lookupKey(name, keymaps, function(b) {
+ if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
+ return doHandleBinding(cm, b);
+ });
+ } else {
+ handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });
+ }
+
+ if (handled) {
+ e_preventDefault(e);
+ restartBlink(cm);
+ if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
+ signalLater(cm, "keyHandled", cm, name, e);
+ }
+ return handled;
+ }
+
+ function handleCharBinding(cm, e, ch) {
+ var handled = lookupKey("'" + ch + "'", allKeyMaps(cm),
+ function(b) { return doHandleBinding(cm, b, true); });
+ if (handled) {
+ e_preventDefault(e);
+ restartBlink(cm);
+ signalLater(cm, "keyHandled", cm, "'" + ch + "'", e);
+ }
+ return handled;
+ }
+
+ var lastStoppedKey = null;
+ function onKeyDown(e) {
+ var cm = this;
+ if (!cm.state.focused) onFocus(cm);
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(
<TRUNCATED>
[43/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/vendor.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/vendor.css b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/vendor.css
deleted file mode 100644
index 53fad89..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/styles/vendor.css
+++ /dev/null
@@ -1,8 +0,0 @@
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset]
,input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{
page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:focus,a:hover{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0
}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{f
ont-weight:400;line-height:1;color:#999}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{col
or:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857
143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.
pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inher
it;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,
.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-p
ush-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8
{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-of
fset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.co
l-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-m
d-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4
{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-l
g-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.tabl
e-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody
>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th
,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hov
er>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bord
ered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-
box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075
),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.checkbox,.radio{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.checkbox label,.radio label{display:inline;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{float:left;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;v
ertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline[disabled],.checkbox[disabled],.radio-inline[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-contr
ol-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1
px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{colo
r:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizonta
l .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active:focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowe
d;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default:active,.btn-default:focus,.btn-default:hover,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default.active,.btn-default:active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primar
y{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary.active,.btn-primary:active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success:act
ive,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;
border-color:#269abc}.btn-info.active,.btn-info:active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning
.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-da
nger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padd
ing:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-hal
flings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-t
h:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{cont
ent:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"
}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyp
hicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:befor
e{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.gly
phicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-
order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\
e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphic
on-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;
background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#999}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom
.dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.
dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px
rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-gr
oup-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-
group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,sele
ct[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]
{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.i
nput-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42
857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-jus
tified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.ac
tive>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .nav
bar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-
brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-me
nu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form
.radio{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;mar
gin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-
toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-
default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-
bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-na
v .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-righ
t-radius:4px;border-top-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-rig
ht-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;
white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:focus,.label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:focus,.label-default[href]:hover{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:70
0;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.nav-pills>.active>a>.badge,a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;borde
r:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;
color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45d
eg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped
.progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,tran
sparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.
badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:focus,a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:focus .list-group-item-text,a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.ac
tive,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.
list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.pa
nel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:fir
st-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbod
y:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>
tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.pan
el>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-c
hild,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th
,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.pa
nel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.
panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-
height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:
1px solid rgba(0,0,0,
<TRUNCATED>
[48/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.css b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.css
deleted file mode 100644
index c665783..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@-webkit-keyframes fadeIn{0%{opacity:0}25%{opacity:.3}50%{opacity:.66}75%{opacity:1}}@keyframes fadeIn{0%{opacity:0}25%{opacity:.3}50%{opacity:.66}75%{opacity:1}}@-webkit-keyframes pulse{0%{text-shadow:0 0 10px rgba(255,255,255,.2),0 0 12px rgba(255,255,255,.2),0 0 16px rgba(255,255,255,.2)}25%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 6px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7)}50%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7)}75%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 25px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 12px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7),0 0 20px rgba(104,185,254,.7)}}@keyframes pulse{0%{text-shadow:0 0 10px rgba(255,255,255,.2),0 0 12px rgba(255,255,255,.2),0 0 16px rgba(255,255,255,.
2)}25%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 6px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7)}50%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7)}75%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 25px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 12px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7),0 0 20px rgba(104,185,254,.7)}}@-webkit-keyframes slide-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0%,0);transform:translate(0%,0)}}@keyframes slide-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0%,0);transform:translate(0%,0)}}@-webkit-keyframes slide-out{0%{-webkit-transform:translate(0%,0);transform:translate(0%,0
)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@keyframes slide-out{100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}svg{position:absolute;left:0;cursor:-webkit-grab;height:100%;width:100%;color:#333}.node{cursor:pointer}.node text.root{font-size:32px}.node text{display:none;fill:#fff;font-weight:200;text-anchor:middle;z-index:1000;text-shadow:1px 1px #333,-1px 1px #333,1px -1px #333,-1px -1px #333}.node.active{opacity:1}.node.active.selected text,.node.active:hover text{display:block}defs #arrow path{stroke:#CCC;stroke-opacity:.2;fill:#CCC;opacity:1}.edge text{stroke-width:0}.edge .edge-handler{fill:none;stroke:none}.edge .edge-line{fill:none}.edge.active text{display:none;fill:#fff;font-weight:200;text-anchor:middle;text-shadow:1px 1px #333,-1px 1px #333,1px -1px #333,-1px -1px #333;z-index:1000}.edge.active.selected,.edge.active:hover{cursor:pointer}.edge.active.highlight text,.edge.active.selected text,.edge.active:hover text{dis
play:block}#zoom-controls{background-color:transparent;background-image:url(images/maze-black.png);border-top-right-radius:3px;border-bottom-right-radius:3px;box-shadow:0 0 5px rgba(255,255,255,.3);margin-top:10%;z-index:5;position:relative;display:block;width:55px}#zoom-controls #zoom-in,#zoom-controls #zoom-out,#zoom-controls #zoom-reset{padding:12px;margin:0;width:100%}#zoom-controls #zoom-in i,#zoom-controls #zoom-out i,#zoom-controls #zoom-reset i{color:#E89619}#zoom-controls #zoom-in:hover,#zoom-controls #zoom-out:hover,#zoom-controls #zoom-reset:hover{background-color:rgba(255,255,255,.2)}#zoom-controls #zoom-in:active,#zoom-controls #zoom-out:active,#zoom-controls #zoom-reset:active{border:0}.fa-caret-down,.fa-caret-right,.fa-search{margin:0 5px;color:#e89619}#search{margin-top:2em;margin-bottom:1em;padding:.5em 1em;width:100%}#search span{vertical-align:bottom}#search input{background-color:#000;border:0;font-size:20px;color:#fff;padding-left:.5em}#search .search-icon{heigh
t:22px;background-color:#000;border-color:#000;border-right-color:#111}#stats{padding:.5em 1em;background-color:transparent;border-bottom:thin dashed #e89619}#stats #stats-header{padding:10px}#stats #all-stats{color:#fff;border-radius:none;border:0;background:0 0;overflow:auto}#stats #all-stats li{padding:3px}#stats #edge-stats-graph,#stats #node-stats-graph{height:250px}#stats #edge-stats-graph svg,#stats #node-stats-graph svg{opacity:.6;background:0 0}#stats #edge-stats-graph text,#stats #node-stats-graph text{font-size:16px;fill:#fff;font-weight:200;text-anchor:middle;z-index:1000}#stats #edge-stats-graph .no-data,#stats #node-stats-graph .no-data{margin:30px 0;color:#e89619}#stats .badge{border-radius:0;height:100%;background-color:rgba(104,185,254,.6)}#editor{padding:.5em 1em;background-color:transparent;border-bottom:thin dashed #e89619}#editor h3{padding:10px}#editor #element-options{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;cursor:
pointer;margin-top:10px;margin-left:2%;color:#fff}#editor #element-options #add-property-form,#editor #element-options .property{display:-webkit-inline-flex;display:inline-flex;margin:4px 0;width:100%}#editor #element-options #add-property-form #add-property #add-prop-value,#editor #element-options .property-value{border:thin rgba(255,255,255,.2) solid;border-left:0;background-color:#000;color:#fff;width:100%;border-top-left-radius:0;border-bottom-left-radius:0}#editor #element-options #add-property-form #add-property #add-prop-key,#editor #element-options .property-name{text-align:center;font-weight:200;cursor:default;background:#2E2E2E;border:thin transparent solid;color:#e89619;border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}#editor #element-options #update-properties,#editor #element-options input[type=submit]{color:#e89619;border-top-right-radius:4px;border-bottom-right-radius:4px;width:auto;background:rgba(255,255,255,.1);border:thin solid #e89619;text-al
ign:center}#editor #element-options #update-properties:active,#editor #element-options #update-properties:focus,#editor #element-options input[type=submit]:active,#editor #element-options input[type=submit]:focus{outline:0}#editor #element-options #update-properties:hover,#editor #element-options input[type=submit]:hover{color:#fff;border:thin solid #fff}#editor #element-options #update-properties{border-radius:4px;padding:10px;width:100%;margin-bottom:20px}#editor #element-options #add-property-form #add-property{display:-webkit-flex;display:flex;-webkit-flex-grow:2;flex-grow:2;-webkit-flex-direction:column;flex-direction:column}#editor #element-options #add-property-form #add-property #add-prop-value{text-align:center;width:100%;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border:thin rgba(255,255,255,.2) solid}#editor #element-options #add-property-form #add-property #add-prop-key{cursor:text;width:100%;border-top-left-radius:4px;border-bot
tom-left-radius:0}#editor #editor-interactions.active{color:#e89619}#editor #editor-interactions.inactive{color:#fff}#editor #edge-editor.enabled,#editor #node-editor.enabled{-webkit-animation:fadeIn 1s linear;animation:fadeIn 1s linear}#control-dash-wrapper{font-family:'Source Sans Pro',Helvetica,sans-serif;letter-spacing:.05em;height:inherit;z-index:inherit;padding:0}#control-dash-wrapper.initial{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}#control-dash-wrapper.initial #dash-toggle{color:#e89619;-webkit-animation:4s pulse linear;animation:4s pulse linear}#control-dash-wrapper.off-canvas{-webkit-transform:translate(-100%,0);transform:translate(-100%,0);-webkit-animation:slide-out .75s linear;animation:slide-out .75s linear}#control-dash-wrapper.off-canvas #dash-toggle{color:#e89619;-webkit-animation:4s pulse linear;animation:4s pulse linear}#control-dash-wrapper.on-canvas{-webkit-animation:slide-in .75s ease-in-out;animation:slide-in .75s ease-in-out}#control-
dash-wrapper.on-canvas *{box-shadow:none!important}#control-dash-wrapper.on-canvas #dash-toggle{color:rgba(232,150,25,.6)}#control-dash-wrapper.on-canvas #dash-toggle:hover{color:#e89619;-webkit-animation:4s pulse linear;animation:4s pulse linear}#control-dash-wrapper #control-dash{overflow-x:hidden;overflow-y:scroll;background-color:transparent;background-image:url(images/maze-black.png);padding:0;height:inherit;z-index:5}#control-dash-wrapper #control-dash h3{display:inline;margin:0}#control-dash-wrapper #dash-toggle{z-index:5;background-color:transparent;background-image:url(images/maze-black.png);border-top-right-radius:3px;border-bottom-right-radius:3px;box-shadow:0 0 5px rgba(255,255,255,.3);position:absolute;left:0;top:50%;font-size:2.2em;color:rgba(255,255,255,.2);padding:10px}#control-dash-wrapper button{border-radius:0;border:0;background-color:transparent}#control-dash-wrapper button:active{border:0}#control-dash-wrapper h3{font-weight:200;margin-top:10px;color:#fff;curso
r:pointer;vertical-align:top}#control-dash-wrapper li{cursor:pointer;background:0 0;border:0;border-radius:0}#clustering{padding:.5em 1em;cursor:pointer;color:#fff;border-bottom:thin dashed #E89619}#clustering #cluster-key-container,#clustering #cluster_control_header{padding:10px 10px 0}#clustering #cluster-key{color:#333;background-color:#000;border-radius:4px;border:thin solid #333;text-align:center;display:inline-block;width:100%}#filters{padding:.5em 1em;background-color:transparent;border-bottom:thin dashed #e89619;color:#fff}#filters form{width:100%}#filters #filter-header{padding:10px}#filters #filter-nodes,#filters #filter-relationships{background-color:transparent;display:inline-block;width:45%;margin-left:2%;overflow:auto;text-align:center;vertical-align:top}#filters #filter-nodes #filter-node-header,#filters #filter-nodes #filter-rel-header,#filters #filter-relationships #filter-node-header,#filters #filter-relationships #filter-rel-header{margin:10px 0;cursor:pointer;ba
ckground-color:transparent;border:0;border-radius:0;width:100%}#filters #filter-nodes #filter-node-header h4,#filters #filter-nodes #filter-rel-header h4,#filters #filter-relationships #filter-node-header h4,#filters #filter-relationships #filter-rel-header h4{font-weight:200;display:inline;color:#fff}#filters #filter-nodes #filter-node-header:active,#filters #filter-nodes #filter-rel-header:active,#filters #filter-relationships #filter-node-header:active,#filters #filter-relationships #filter-rel-header:active{border:0;box-shadow:none}#filters #filter-nodes #node-dropdown,#filters #filter-nodes #rel-dropdown,#filters #filter-relationships #node-dropdown,#filters #filter-relationships #rel-dropdown{margin:20px 0;border-radius:none;border:0;background:0 0}#filters #filter-nodes #node-dropdown li,#filters #filter-nodes #rel-dropdown li,#filters #filter-relationships #node-dropdown li,#filters #filter-relationships #rel-dropdown li{padding:5px}#filters #filter-nodes #node-dropdown li:h
over,#filters #filter-nodes #rel-dropdown li:hover,#filters #filter-relationships #node-dropdown li:hover,#filters #filter-relationships #rel-dropdown li:hover{background-color:rgba(255,255,255,.2)}#filters .disabled{color:rgba(255,255,255,.5)}#filters .disabled:hover{color:#fdc670}.alchemy{position:relative}.alchemy #search form{z-index:2;display:inline;margin-left:100px}.alchemy #add-tag{width:300px;display:inline-block}.alchemy #tags input{max-width:220px}.alchemy #tags-list{padding:0}.alchemy #tags-list .icon-remove-sign{cursor:pointer}.alchemy #tags-list li{display:inline-block;margin-top:5px}.alchemy #tags-list span{background-color:#ccc;color:#333;border-radius:10em;display:inline-block;padding:1px 6px}.alchemy #filter-nodes label,.alchemy #filter-relationships label{font-weight:400;margin-right:1em}.alchemy .clear{clear:both}.alchemy text{font-weight:200;text-anchor:middle}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.js b/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.js
deleted file mode 100644
index 5f43854..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/scripts/alchemy/alchemy.min.js
+++ /dev/null
@@ -1,3 +0,0 @@
-(function(){"Alchemy.js is a graph drawing application for the web.\nCopyright (C) 2014 GraphAlchemist, Inc.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\nlets";var a,b,c,d,e,f,g,h,i,j,k,l,m=[].slice,n=function(a,b){return function(){return a.apply(b,arguments)}};a=function(){function a(a){null==a&&(a=null),this.a=this,this.version="0.4.1",this.get=new this.Get(this),this.remove=new this.Rem
ove(this),this.create=new this.Create(this),this.set=new this.Set(this),this.drawing={DrawEdge:c(this),DrawEdges:d(this),DrawNode:e(this),DrawNodes:f(this),EdgeUtils:this.EdgeUtils(this),NodeUtils:this.NodeUtils(this)},this.controlDash=this.controlDash(this),this.stats=this.stats(this),this.layout=j,this.clustering=b,this.models={Node:this.Node(this),Edge:this.Edge(this)},this.utils={warnings:new l(this)},this.filters=this.filters(this),this.exports=this.exports(this),this.visControls={},this.styles={},this.editor={},this.log={},this.state={interactions:"default",layout:"default"},this.startGraph=this.startGraph(this),this.updateGraph=this.updateGraph(this),this.generateLayout=this.generateLayout(this),this.svgStyles=this.svgStyles(this),this.interactions=this.interactions(this),this.search=this.search(this),this.plugins=this.plugins(this),this._nodes={},this._edges={},this.getNodes=this.get.getNodes,this.getEdges=this.get.getEdges,this.allNodes=this.get.allNodes,this.allEdges=this.
get.allEdges,a&&this.begin(a)}return a.prototype.begin=function(b){var c;switch(c=this.setConf(b),typeof this.conf.dataSource){case"string":d3.json(this.a.conf.dataSource,this.a.startGraph);break;case"object":this.a.startGraph(this.a.conf.dataSource)}return this.plugins.init(),a.prototype.instances.push(this),this},a.prototype.setConf=function(a){var b,c;null!=a.theme&&(a=_.merge(_.cloneDeep(this.defaults),this.a.themes[""+a.theme]));for(b in a)switch(c=a[b],b){case"clusterColors":a.clusterColours=c;break;case"backgroundColor":a.backgroundColour=c;break;case"nodeColor":a[nodeColour]=c}return this.a.conf=_.merge(_.cloneDeep(this.defaults),a)},a.prototype.instances=[],a.prototype.getInst=function(b){var c;return c=parseInt(d3.select(b).attr("alchInst")),a.prototype.instances[c]},a}(),k="undefined"!=typeof exports&&null!==exports?exports:this,k.Alchemy=a,k.alchemy={begin:function(b){return k.alchemy=new a(b)}},a.prototype.Create=function(){function a(a){this.a=a}return a.prototype.node
s=function(){var a,b,c,d,e,f,g;for(c=arguments[0],d=2<=arguments.length?m.call(arguments,1):[],a=this.a,e=function(b){var c;return a._nodes[b.id]?console.warn("A node with the id "+b.id+" already exists.\nConsider using the @a.get.nodes() method to \nretrieve the node and then using the Node methods."):(c=new a.models.Node(b),a._nodes[b.id]=c,[c])},d=_.union(d,c),f=0,g=d.length;g>f;f++)b=d[f],e(b);return this.a.initial?this.a.updateGraph():void 0},a.prototype.edges=function(){var a,b,c,d,e;return c=arguments[0],d=2<=arguments.length?m.call(arguments,1):[],a=this.a,e=function(b){var c,d;return b.id&&!a._edges[b.id]?(c=new a.models.Edge(b),a._edges[b.id]=[c],[c]):b.id&&a._edges[b.id]?console.warn("An edge with that id "+someEdgeMap.id+" already exists.\nConsider using the @a.get.edge() method to \nretrieve the edge and then using the Edge methods.\nNote: id's are not required for edges. Alchemy will create\nan unlimited number of edges for the same source and target node.\nSimply omi
t 'id' when creating the edge."):(d=a._edges[""+b.source+"-"+b.target],d?(c=new a.models.Edge(b,d.length),d.push(c),[c]):(c=new a.models.Edge(b,0),a._edges[""+b.source+"-"+b.target]=[c],[c]))},b=_.uniq(_.flatten(arguments)),_.each(b,function(a){return e(a)}),this.a.initial?this.a.updateGraph():void 0},a}(),a.prototype.Get=function(a){return{a:a,_el:[],_elType:null,_makeChain:function(a){var b;for(b=this,b.__proto__=[].__proto__;b.length;)b.pop();return _.each(a,function(a){return b.push(a)}),b},nodes:function(){var a,b,c,d,e;return c=arguments[0],d=2<=arguments.length?m.call(arguments,1):[],null!=c&&(b=_.map(arguments,function(a){return String(a)}),a=this.a,e=function(a){return _.filter(a._nodes,function(a,c){return _.contains(b,c)?a:void 0})}(a)),this._elType="node",this._el=e,this._makeChain(e)},edges:function(){var a,b,c,d,e;return d=arguments[0],e=2<=arguments.length?m.call(arguments,1):[],null!=d&&(b=_.map(arguments,function(a){return String(a)}),a=this.a,c=function(a){return _
.flatten(_.filter(a._edges,function(a,c){return _.contains(b,c)?a:void 0}))}(a)),this._elType="edge",this._el=c,this._makeChain(c)},all:function(){var a,b;return a=this.a,b=this._elType,this._el=function(b){switch(b){case"node":return a.elements.nodes.val;case"edge":return a.elements.edges.flat}}(b),this._makeChain(this._el)},elState:function(a){var b;return b=_.filter(this._el,function(b){return b._state===a}),this._el=b,this._makeChain(b)},state:function(){return null!=this.a.state.key?this.a.state.key:void 0},type:function(a){var b;return b=_.filter(this._el,function(b){return b._nodeType===a||b._edgeType===a}),this._el=b,this._makeChain(b)},activeNodes:function(){return _.filter(this.a._nodes,function(a){return"active"===a._state?a:void 0})},activeEdges:function(){return _.filter(this.a.get.allEdges(),function(a){return"active"===a._state?a:void 0})},state:function(){return null!=this.a.state.key?this.a.state.key:void 0},clusters:function(){var a,b;return a=this.a.layout._cluste
ring.clusterMap,b={},_.each(a,function(a,c){return b[c]=_.select(this.a.get.allNodes(),function(a){return a.getProperties()[this.a.conf.clusterKey]===c})}),b},clusterColours:function(){var a,b;return b=this.a.layout._clustering.clusterMap,a={},_.each(b,function(b,c){return a[c]=this.a.conf.clusterColours[b%this.a.conf.clusterColours.length]}),a},allEdges:function(){return this.a.elements.nodes.flat},allNodes:function(a){return null!=a?_.filter(this.a._nodes,function(b){return b._nodeType===a?b:void 0}):this.a.elements.nodes.val},getNodes:function(){var a,b,c;return b=arguments[0],c=2<=arguments.length?m.call(arguments,1):[],a=this.a,c.push(b),_.map(c,function(b){return a._nodes[b]})},getEdges:function(a,b){var c,d;return null==a&&(a=null),null==b&&(b=null),c=this.a,null!=a&&null!=b?(d=""+a+"-"+b,this.a._edges[d]):null!=a&&null==b?this.a._nodes[a]._adjacentEdges:void 0}}},a.prototype.Remove=function(){function a(a){this.a=a}return a.prototype.nodes=function(a){return _.each(a,functio
n(a){return null!=a._nodeType?a.remove():void 0})},a.prototype.edges=function(a){return _.each(a,function(a){return null!=a._edgeType?a.remove():void 0})},a}(),a.prototype.Set=function(a){return{a:a,state:function(a,b){return this.a.state.key=b}}},b=function(){function a(a){var b,c,d,e,f,g,h,i;this.a=a,d=this.a._nodes,c=this.a.conf,b=this,this.clusterKey=c.clusterKey,this.identifyClusters(this.a),e=-500,i=function(a){var b,c;return b=d[a.source.id]._properties[this.clusterKey],c=d[a.target.id]._properties[this.clusterKey],b===c?.15:0},f=function(){return.7},h=function(a){return d=a.self.a._nodes,d[a.source.id]._properties.root||d[a.target.id]._properties.root?300:d[a.source.id]._properties[this.clusterKey]===d[a.target.id]._properties[this.clusterKey]?10:600},g=function(a){return 8*a},this.layout={charge:e,linkStrength:function(a){return i(a)},friction:function(){return f()},linkDistancefn:function(a){return h(a)},gravity:function(a){return g(a)}}}return a.prototype.identifyClusters
=function(a){var b,c,d;return c=a.elements.nodes.val,b=_.uniq(_.map(c,function(b){return b.getProperties()[a.conf.clusterKey]})),this.clusterMap=_.zipObject(b,function(){d=[];for(var a=0,c=b.length;c>=0?c>=a:a>=c;c>=0?a++:a--)d.push(a);return d}.apply(this))},a.prototype.getClusterColour=function(a){var b;return b=this.clusterMap[a]%this.a.conf.clusterColours.length,this.a.conf.clusterColours[b]},a.prototype.edgeGradient=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;for(c=this.a.vis.select(""+this.a.conf.divSelector+" svg"),b={},j=this.a._nodes,n=_.map(a,function(a){return a._d3}),l=0,m=n.length;m>l;l++)if(d=n[l],!j[d.source.id]._properties.root&&!j[d.target.id]._properties.root&&j[d.source.id]._properties[this.clusterKey]!==j[d.target.id]._properties[this.clusterKey]&&j[d.target.id]._properties[this.clusterKey]!==j[d.source.id]._properties[this.clusterKey]){if(h=j[d.source.id]._properties[this.clusterKey]+"-"+j[d.target.id]._properties[this.clusterKey],h in b)continue;h in b||(k=this
.getClusterColour(j[d.target.id]._properties[this.clusterKey]),e=this.getClusterColour(j[d.source.id]._properties[this.clusterKey]),b[h]={startColour:k,endColour:e})}o=[];for(i in b)g="cluster-gradient-"+i,f=c.append("svg:linearGradient").attr("id",g),f.append("svg:stop").attr("offset","0%").attr("stop-color",b[i].startColour),o.push(f.append("svg:stop").attr("offset","100%").attr("stop-color",b[i].endColour));return o},a}(),a.prototype.clusterControls={init:function(){var a;return a="<input class='form-control form-inline' id='cluster-key' placeholder=\"Cluster Key\"></input>",this.a.dash.select("#clustering-container").append("div").attr("id","cluster-key-container").attr("class","property form-inline form-group").html(a).style("display","none"),this.a.dash.select("#cluster_control_header").on("click",function(){var a,b;return b=this.a.dash.select("#cluster-key-container"),a=b.style("display")}),element.style("display",function(){return"block"===display?"none":"block"}),"none"===t
his.a.dash.select("#cluster-key-container").style("display")?this.a.dash.select("#cluster-arrow").attr("class","fa fa-2x fa-caret-right"):this.a.dash.select("#cluster-arrow").attr("class","fa fa-2x fa-caret-down"),this.a.dash.select("#cluster-key").on("keydown",function(){return"Enter"===d3.event.keyIdentifier?(this.a.conf.cluster=!0,this.a.conf.clusterKey=this.value,this.a.generateLayout()):void 0})}},a.prototype.controlDash=function(a){var b;return b=a,{init:function(){var a;return this.dashIsShown()?(a=b.conf.divSelector,b.dash=d3.select(""+a).append("div").attr("id","control-dash-wrapper").attr("class","col-md-4 initial"),b.dash.append("i").attr("id","dash-toggle").attr("class","fa fa-flask col-md-offset-12"),b.dash.append("div").attr("id","control-dash").attr("class","col-md-12"),b.dash.select("#dash-toggle").on("click",b.interactions.toggleControlDash),b.controlDash.zoomCtrl(),b.controlDash.search(),b.controlDash.filters(),b.controlDash.stats(),b.controlDash.clustering(),b.con
trolDash.exports()):void 0},search:function(){return b.conf.search?(b.dash.select("#control-dash").append("div").attr("id","search").html("<div class='input-group'>\n <input class='form-control' placeholder='Search'>\n <i class='input-group-addon search-icon'><span class='fa fa-search fa-1x'></span></i>\n</div> "),b.search.init()):void 0},zoomCtrl:function(){return b.conf.zoomControls?(b.dash.select("#control-dash-wrapper").append("div").attr("id","zoom-controls").attr("class","col-md-offset-12").html("<button id='zoom-reset' class='btn btn-defualt btn-primary'><i class='fa fa-crosshairs fa-lg'></i></button> <button id='zoom-in' class='btn btn-defualt btn-primary'><i class='fa fa-plus'></i></button> <button id='zoom-out' class='btn btn-default btn-primary'><i class='fa fa-minus'></i></button>"),b.dash.select("#zoom-in").on("click",function(){return b.interactions.clickZoom("in")}),b.dash.select("#zoom-out").on("click",function(){return b.interactions.clickZoom("out")}),b.das
h.select("#zoom-reset").on("click",function(){return b.interactions.clickZoom("reset")})):void 0},filters:function(){return b.conf.nodeFilters||b.conf.edgeFilters?(b.dash.select("#control-dash").append("div").attr("id","filters"),b.filters.init()):void 0},stats:function(){var a;return b.conf.nodeStats||b.conf.edgeStats?(a='<div id = "stats-header" data-toggle="collapse" data-target="#stats #all-stats">\n<h3>\n Statistics\n</h3>\n<span class = "fa fa-caret-right fa-2x"></span>\n</div>\n<div id="all-stats" class="collapse">\n <ul class = "list-group" id="node-stats"></ul>\n <ul class = "list-group" id="rel-stats"></ul> \n</div>',b.dash.select("#control-dash").append("div").attr("id","stats").html(a).select("#stats-header").on("click",function(){return b.dash.select("#all-stats").classed("in")?b.dash.select("#stats-header>span").attr("class","fa fa-2x fa-caret-right"):b.dash.select("#stats-header>span").attr("class","fa fa-2x fa-caret-down")}),b.stats.init()):void 0},exports:
function(){var a;return b.conf.exportSVG?(a='<div id="exports-header" data-toggle="collapse" data-target="#all-exports" style="padding:10px;">\n <h3>\n Exports\n </h3>\n <span class="fa fa-caret-right fa-2x"></span>\n</div>\n<div id="all-exports" class="collapse"></div>',b.dash.select("#control-dash").append("div").attr("id","exports").attr("style","padding: 0.5em 1em; border-bottom: thin dashed #E89619; color: white;").html(a).select("#exports-header"),b.exports.init()):void 0},clustering:function(){var a;return b.conf.clusterControl?(a='<div id="clustering-container">\n <div id="cluster_control_header" data-toggle="collapse" data-target="#clustering #cluster-options">\n <h3>Clustering</h3>\n <span id="cluster-arrow" class="fa fa-2x fa-caret-right"></span>\n </div>\n</div>',b.dash.select("#control-dash").append("div").attr("id","clustering").html(a).select("#cluster_control_header"),b.clusterControls.init()):void 0},dashIsShown:function(){var a;
return a=b.conf,a.showEditor||a.captionToggle||a.toggleRootNodes||a.removeElement||a.clusterControl||a.nodeStats||a.edgeStats||a.edgeFilters||a.nodeFilters||a.edgesToggle||a.nodesToggle||a.search||a.exportSVG}}},a.prototype.filters=function(){return function(a){var b;return b=a,{init:function(){var a,c,d,e,f,g,h,i,j,k,l,m;if(b.filters.show(),b.conf.edgeFilters&&b.filters.showEdgeFilters(),b.conf.nodeFilters&&b.filters.showNodeFilters(),b.conf.nodeTypes){for(e=Object.keys(b.conf.nodeTypes),g="",m=b.conf.nodeTypes[e],i=0,k=m.length;k>i;i++)f=m[i],a=f.replace("_"," "),g+="<li class='list-group-item nodeType' role='menuitem' id='li-"+f+"' name="+f+">"+a+"</li>";b.dash.select("#node-dropdown").html(g)}if(b.conf.edgeTypes){for(h=_.isPlainObject(b.conf.edgeTypes)?_.values(b.conf.edgeTypes)[0]:b.conf.edgeTypes,d="",j=0,l=h.length;l>j;j++)c=h[j],a=c.replace("_"," "),d+="<li class='list-group-item edgeType' role='menuitem' id='li-"+c+"' name="+c+">"+a+"</li>";b.dash.select("#rel-dropdown").ht
ml(d)}return b.conf.captionsToggle&&b.filters.captionsToggle(),b.conf.edgesToggle&&b.filters.edgesToggle(),b.conf.nodesToggle&&b.filters.nodesToggle(),b.filters.update()},show:function(){var a;return a='<div id = "filter-header" data-toggle="collapse" data-target="#filters form">\n <h3>Filters</h3>\n <span class = "fa fa-2x fa-caret-right"></span>\n</div>\n <form class="form-inline collapse">\n </form>',b.dash.select("#control-dash #filters").html(a),b.dash.selectAll("#filter-header").on("click",function(){return b.dash.select("#filters>form").classed("in")?b.dash.select("#filter-header>span").attr("class","fa fa-2x fa-caret-right"):b.dash.select("#filter-header>span").attr("class","fa fa-2x fa-caret-down")}),b.dash.select("#filters form")},showEdgeFilters:function(){var a;return a='<div id="filter-rel-header" data-target = "#rel-dropdown" data-toggle="collapse">\n <h4>\n Edge Types\n </h4>\n <span class="fa fa-lg fa-caret-right"></span>\n</div>\n<ul id="
rel-dropdown" class="collapse list-group" role="menu">\n</ul>',b.dash.select("#filters form").append("div").attr("id","filter-relationships").html(a),b.dash.select("#filter-rel-header").on("click",function(){return b.dash.select("#rel-dropdown").classed("in")?b.dash.select("#filter-rel-header>span").attr("class","fa fa-lg fa-caret-right"):b.dash.select("#filter-rel-header>span").attr("class","fa fa-lg fa-caret-down")})},showNodeFilters:function(){var a;return a='<div id="filter-node-header" data-target = "#node-dropdown" data-toggle="collapse">\n <h4>\n Node Types\n </h4>\n <span class="fa fa-lg fa-caret-right"></span>\n</div>\n<ul id="node-dropdown" class="collapse list-group" role="menu">\n</ul>',b.dash.select("#filters form").append("div").attr("id","filter-nodes").html(a),b.dash.select("#filter-node-header").on("click",function(){return b.dash.select("#node-dropdown").classed("in")?b.dash.select("#filter-node-header>span").attr("class","fa fa-lg fa-caret-right"):
b.dash.select("#filter-node-header>span").attr("class","fa fa-lg fa-caret-down")})},captionsToggle:function(){return b.dash.select("#filters form").append("li").attr({id:"toggle-captions","class":"list-group-item active-label toggle"}).html("Show Captions").on("click",function(){var a;return a=b.dash.select("g text").attr("style"),"display: block"===a?b.dash.selectAll("g text").attr("style","display: none"):b.dash.selectAll("g text").attr("style","display: block")})},edgesToggle:function(){return b.dash.select("#filters form").append("li").attr({id:"toggle-edges","class":"list-group-item active-label toggle"}).html("Toggle Edges").on("click",function(){return _.contains(_.pluck(_.flatten(_.values(b._edges)),"_state"),"active")?_.each(_.values(b._edges),function(a){return _.each(a,function(a){return"active"===a._state?a.toggleHidden():void 0})}):_.each(_.values(b._edges),function(a){return _.each(a,function(a){var c,d;return c=b._nodes[a._properties.source],d=b._nodes[a._properties.t
arget],"active"===c._state&&"active"===d._state?a.toggleHidden():void 0})})})},nodesToggle:function(){return b.dash.select("#filters form").append("li").attr({id:"toggle-nodes","class":"list-group-item active-label toggle"}).html("Toggle Nodes").on("click",function(){var a;return a=_.values(b._nodes),_.contains(_.pluck(a,"_state"),"active")?_.each(a,function(a){return b.conf.toggleRootNodes&&a._d3.root?void 0:"active"===a._state?a.toggleHidden():void 0}):_.each(_.values(b._nodes),function(a){return b.conf.toggleRootNodes&&a._d3.root?void 0:a.toggleHidden()})})},update:function(){return b.dash.selectAll(".nodeType, .edgeType").on("click",function(){var a,c;return a=d3.select(this),c=a.attr("name"),b.vis.selectAll("."+c).each(function(a){var c,d,e,f;return null!=b._nodes[a.id]?(d=b._nodes[a.id],d.toggleHidden()):(c=b._edges[a.id][0],e=b._nodes[c._properties.source],f=b._nodes[c._properties.target],"active"===e._state&&"active"===f._state?c.toggleHidden():void 0)}),b.stats.nodeStats()}
)}}}}(this),a.prototype.Index=function(a){var b,c,d,e;return b=a,d={nodes:{val:function(){return _.values(b._nodes)}()},edges:{val:function(){return _.values(b._edges)}()}},e=d.nodes,c=d.edges,d.edges.flat=function(){return _.flatten(c.val)}(),d.nodes.d3=function(){return _.map(e.val,function(a){return a._d3})}(),d.edges.d3=function(){return _.map(c.flat,function(a){return a._d3})}(),b.elements=d,function(){return b.elements.nodes.svg=function(){return b.vis.selectAll("g.node")}(),b.elements.edges.svg=function(){return b.vis.selectAll("g.edge")}()}},a.prototype.interactions=function(b){var c;return c=b,{edgeClick:function(a){var b;if(!d3.event.defaultPrevented)return d3.event.stopPropagation(),b=a.self,"function"==typeof c.conf.edgeClick&&c.conf.edgeClick(b),"hidden"!==b._state?(b._state=function(){return"selected"===b._state?"active":"selected"}(),b.setStyles()):void 0},edgeMouseOver:function(a){var b;return b=a.self,"hidden"!==b._state?("selected"!==b._state&&(b._state="highlighte
d"),b.setStyles()):void 0},edgeMouseOut:function(a){var b;return b=a.self,"hidden"!==b._state?("selected"!==b._state&&(b._state="active"),b.setStyles()):void 0},nodeMouseOver:function(a){var b;if(b=a.self,"hidden"!==b._state){if("selected"!==b._state&&(b._state="highlighted",b.setStyles()),"function"==typeof c.conf.nodeMouseOver)return c.conf.nodeMouseOver(b);if("number"==typeof c.conf.nodeMouseOver)return b.properties[c.conf.nodeMouseOver]}},nodeMouseOut:function(a){var b;return b=a.self,c=b.a,"hidden"!==b._state&&("selected"!==b._state&&(b._state="active",b.setStyles()),null!=c.conf.nodeMouseOut&&"function"==typeof c.conf.nodeMouseOut)?c.conf.nodeMouseOut(a):void 0},nodeClick:function(a){var b;if(!d3.event.defaultPrevented)return d3.event.stopPropagation(),b=a.self,"function"==typeof c.conf.nodeClick&&c.conf.nodeClick(b),"hidden"!==b._state?(b._state=function(){return"selected"===b._state?"active":"selected"}(),b.setStyles()):void 0},zoom:function(b){return null==this._zoomBehavio
r&&(this._zoomBehavior=d3.behavior.zoom()),this._zoomBehavior.scaleExtent(b).on("zoom",function(){return c=a.prototype.getInst(this),c.vis.attr("transform","translate("+d3.event.translate+") scale("+d3.event.scale+")")})},clickZoom:function(a){var b,d,e,f;return f=c.vis.attr("transform").match(/(-*\d+\.*\d*)/g).map(function(a){return parseFloat(a)}),d=f[0],e=f[1],b=f[2],c.vis.attr("transform",function(){return"in"===a?(b<c.conf.scaleExtent[1]&&(b+=.2),"translate("+d+","+e+") scale("+b+")"):"out"===a?(b>c.conf.scaleExtent[0]&&(b-=.2),"translate("+d+","+e+") scale("+b+")"):"reset"===a?"translate(0,0) scale(1)":console.log("error")}),null==this._zoomBehavior&&(this._zoomBehavior=d3.behavior.zoom()),this._zoomBehavior.scale(b).translate([d,e])},nodeDragStarted:function(a){return d3.event.preventDefault,d3.event.sourceEvent.stopPropagation(),d3.select(this).classed("dragging",!0),a.fixed=!0},nodeDragged:function(a){var b,d;return c=a.self.a,a.x+=d3.event.dx,a.y+=d3.event.dy,a.px+=d3.even
t.dx,a.py+=d3.event.dy,d=d3.select(this),d.attr("transform","translate("+a.x+", "+a.y+")"),b=a.self._adjacentEdges,_.each(b,function(a){var b;return b=c.vis.select("#edge-"+a.id+"-"+a._index),c._drawEdges.updateEdge(b.data()[0])})},nodeDragended:function(a){return c=a.self.a,d3.select(this).classed({dragging:!1}),c.conf.forceLocked?void 0:c.force.start()},nodeDoubleClick:function(){return null},deselectAll:function(){var b;return c=a.prototype.getInst(this),(null!=(b=d3.event)?b.defaultPrevented:0)?void 0:(c.conf.showEditor===!0&&c.modifyElements.nodeEditorClear(),_.each(c._nodes,function(a){return a._state="active",a.setStyles()}),_.each(c._edges,function(a){return _.each(a,function(a){return a._state="active",a.setStyles()})}),c.conf.deselectAll?c.conf.deselectAll():void 0)}}},j=function(){function a(a){this.tick=n(this.tick,this),this.linkStrength=n(this.linkStrength,this),this.gravity=n(this.gravity,this);var b,c,d;this.a=b=a,c=this.a.conf,d=this.a._nodes,this.k=Math.sqrt(Math.l
og(_.size(this.a._nodes))/(c.graphWidth()*c.graphHeight())),this._clustering=new this.a.clustering(this.a),this.d3NodeInternals=b.elements.nodes.d3,c.cluster?(this._charge=function(){return this._clustering.layout.charge},this._linkStrength=function(a){return this._clustering.layout.linkStrength(a)}):(this._charge=function(){return-10/this.k},this._linkStrength=function(a){return d[a.source.id].getProperties("root")||d[a.target.id].getProperties("root")?1:.9}),c.cluster?this._linkDistancefn=function(a){return this._clustering.layout.linkDistancefn(a)}:"default"===c.linkDistancefn?this._linkDistancefn=function(){return 1/(50*this.k)}:"number"==typeof c.linkDistancefn?this._linkDistancefn=function(){return c.linkDistancefn}:"function"==typeof c.linkDistancefn&&(this._linkDistancefn=function(a){return c.linkDistancefn(a)})}return a.prototype.gravity=function(){return this.a.conf.cluster?this._clustering.layout.gravity(this.k):50*this.k},a.prototype.linkStrength=function(a){return this.
_linkStrength(a)},a.prototype.friction=function(){return.9},a.prototype.collide=function(a){var b,c,d,e,f,g;return b=this.a.conf,g=2*(a.radius+a["stroke-width"])+b.nodeOverlap,c=a.x-g,d=a.x+g,e=a.y-g,f=a.y+g,function(h,i,j,k,l){var m,n,o;return h.point&&h.point!==a&&(n=a.x-Math.abs(h.point.x),o=a.y-h.point.y,m=Math.sqrt(n*n+o*o),g=g,g>m&&(m=(m-g)/m*b.alpha,a.x-=n*=m,a.y-=o*=m,h.point.x+=n,h.point.y+=o)),i>d||c>k||j>f||e>l}},a.prototype.tick=function(){var a,b,c,d,e,f,g,h;if(a=this.a,d=a.elements.nodes.svg,b=a.elements.edges.svg,a.conf.collisionDetection)for(e=d3.geom.quadtree(this.d3NodeInternals),h=this.d3NodeInternals,f=0,g=h.length;g>f;f++)c=h[f],e.visit(this.collide(c));return d.attr("transform",function(a){return"translate("+a.x+","+a.y+")"}),this.drawEdge=a.drawing.DrawEdge,this.drawEdge.styleText(b),this.drawEdge.styleLink(b)},a.prototype.positionRootNodes=function(){var a,b,c,d,e,f,g,h,i,j;if(a=this.a.conf,b={width:a.graphWidth(),height:a.graphHeight()},e=_.filter(this.a.ele
ments.nodes.val,function(a){return a.getProperties("root")}),1!==e.length){for(j=[],c=f=0,g=e.length;g>f;c=++f)d=e[c],d._d3.x=b.width/Math.sqrt(e.length*(c+1)),d._d3.y=b.height/2,j.push(d._d3.fixed=!0);return j}d=e[0],h=[b.width/2,b.width/2],d._d3.x=h[0],d._d3.px=h[1],i=[b.height/2,b.height/2],d._d3.y=i[0],d._d3.py=i[1],d._d3.fixed=!0},a.prototype.chargeDistance=function(){return 500},a.prototype.linkDistancefn=function(a){return this._linkDistancefn(a)},a.prototype.charge=function(){return this._charge()},a}(),a.prototype.generateLayout=function(a){var b;return b=a,function(a){var c;return null==a&&(a=!1),c=b.conf,b.layout=new j(b),b.force=d3.layout.force().size([c.graphWidth(),c.graphHeight()]).theta(1).gravity(b.layout.gravity()).friction(b.layout.friction()).nodes(b.elements.nodes.d3).links(b.elements.edges.d3).linkDistance(function(a){return b.layout.linkDistancefn(a)}).linkStrength(function(a){return b.layout.linkStrength(a)}).charge(b.layout.charge()).chargeDistance(b.layout.
chargeDistance())}},a.prototype.search=function(a){var b;return b=a,{init:function(){var a;return a=b.dash.select("#search input"),a.on("keyup",function(){var c;return c=a[0][0].value.toLowerCase(),b.vis.selectAll(".node").classed("inactive",!1),b.vis.selectAll("text").attr("style",function(){return""!==c?"display: inline;":void 0}),b.vis.selectAll(".node").classed("inactive",function(a){var d,e;switch(d=d3.select(this).text(),b.conf.searchMethod){case"contains":e=d.toLowerCase().indexOf(c)<0;break;case"begins":e=0!==d.toLowerCase().indexOf(c)}return e?b.vis.selectAll("[source-target*='"+a.id+"']").classed("inactive",e):b.vis.selectAll("[source-target*='"+a.id+"']").classed("inactive",function(a){var c,d,e;return c=[a.source.id,a.target.id],d=b.vis.select("#node-"+c[0]).classed("inactive"),e=b.vis.select("#node-"+c[1]).classed("inactive"),e||d}),e})})}}},a.prototype.startGraph=function(b){var c;return c=b,function(b){var d,e,f,g,h,i;if(d=c.conf,d3.select(d.divSelector).empty()&&cons
ole.warn(c.utils.warnings.divWarning()),b||(b={nodes:[],edges:[]},c.utils.warnings.dataWarning()),null==b.edges&&(b.edges=[]),c.create.nodes(b.nodes),b.edges.forEach(function(a){return c.create.edges(a)}),c.vis=d3.select(d.divSelector).attr("style","width:"+d.graphWidth()+"px; height:"+d.graphHeight()+"px; background:"+d.backgroundColour+";").append("svg").attr("xmlns","http://www.w3.org/2000/svg").attr("xlink","http://www.w3.org/1999/xlink").attr("pointer-events","all").attr("style","background:"+d.backgroundColour+";").attr("alchInst",a.prototype.instances.length-1).on("click",c.interactions.deselectAll).call(c.interactions.zoom(d.scaleExtent)).on("dblclick.zoom",null).append("g").attr("transform","translate("+d.initialTranslate+") scale("+d.initialScale+")"),c.interactions.zoom().scale(d.initialScale),c.interactions.zoom().translate(d.initialTranslate),c.index=a.prototype.Index(c),c.generateLayout(),c.controlDash.init(),e=c.elements.edges.d3,f=c.elements.nodes.d3,c.layout.positio
nRootNodes(),c.force.start(),d.forceLocked)for(;c.force.alpha()>.005;)c.force.tick();return c._drawEdges=c.drawing.DrawEdges,c._drawNodes=c.drawing.DrawNodes,c._drawEdges.createEdge(e),c._drawNodes.createNode(f),c.index(),c.elements.nodes.svg.attr("transform",function(a){return"translate("+a.x+", "+a.y+")"}),console.log(Date()+" completed initial computation"),d.forceLocked||c.force.on("tick",c.layout.tick).start(),null!=d.afterLoad&&("function"==typeof d.afterLoad?d.afterLoad():"string"==typeof d.afterLoad&&(c[d.afterLoad]=!0)),d.cluster&&(g=d3.select(""+c.conf.divSelector+" svg").append("svg:defs")),d.nodeStats&&c.stats.nodeStats(),d.showEditor&&(h=new c.editor.Editor,i=new c.editor.Interactions,d3.select("body").on("keydown",i.deleteSelected),h.startEditor()),c.initial=!0}},a.prototype.stats=function(a){var b;return b=a,{init:function(){return b.stats.update()},nodeStats:function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o;if(f=[],c=b.get.allNodes().length,a=b.get.activeNodes().length,e=c-
a,j="<li class = 'list-group-item gen_node_stat'>Number of nodes: <span class='badge'>"+c+"</span></li> <li class = 'list-group-item gen_node_stat'>Number of active nodes: <span class='badge'>"+a+"</span></li> <li class = 'list-group-item gen_node_stat'>Number of inactive nodes: <span class='badge'>"+e+"</span></li></br>",b.conf.nodeTypes){for(h=Object.keys(b.conf.nodeTypes),l="",o=b.conf.nodeTypes[h],m=0,n=o.length;n>m;m++)k=o[m],d=k.replace("_"," "),i=b.vis.selectAll("g.node."+k)[0].length,l+="<li class = 'list-group-item nodeType' id='li-"+k+"' name = "+d+">Number of <strong style='text-transform: uppercase'>"+d+"</strong> nodes: <span class='badge'>"+i+"</span></li>",f.push([""+k,i]);j+=l}return g="<li id='node-stats-graph' class='list-group-item'></li>",j+=g,b.dash.select("#node-stats").html(j),this.insertSVG("node",f)},edgeStats:function(){var a,c,d,e,f,g,h,i,j,k,l,m,n;if(e=[],c=b.get.allEdges().length,a=b.get.activeEdges().length,l=c-a,i="<li class = 'list-group-item gen_edge
_stat'>Number of relationships: <span class='badge'>"+c+"</span></li> <li class = 'list-group-item gen_edge_stat'>Number of active relationships: <span class='badge'>"+a+"</span></li> <li class = 'list-group-item gen_edge_stat'>Number of inactive relationships: <span class='badge'>"+l+"</span></li></br>",b.conf.edgeTypes){for(g=_.values(alchemy.conf.edgeTypes)[0],k="",m=0,n=g.length;n>m;m++)j=g[m],j&&(d=j.replace("_"," "),h=_.filter(b.get.allEdges(),function(a){return a._edgeType===j?a:void 0}).length,k+="<li class = 'list-group-item edgeType' id='li-"+j+"' name = "+d+">Number of <strong style='text-transform: uppercase'>"+d+"</strong> relationships: <span class='badge'>"+h+"</span></li>",e.push([""+d,h]));i+=k}return f="<li id='node-stats-graph' class='list-group-item'></li>",i+=f,b.dash.select("#rel-stats").html(i),this.insertSVG("edge",e)},insertSVG:function(a,c){var d,e,f,g,h,i,j,k;return null===c?b.dash.select("#"+a+"-stats-graph").html("<br><h4 class='no-data'>There are no "+a
+"Types listed in your conf.</h4>"):(k=.25*b.conf.graphWidth(),g=250,i=k/4,f=d3.scale.category20(),d=d3.svg.arc().outerRadius(i-10).innerRadius(i/2),h=d3.layout.pie().sort(null).value(function(a){return a[1]}),j=b.dash.select("#"+a+"-stats-graph").append("svg").append("g").style({width:k,height:g}).attr("transform","translate("+k/2+","+g/2+")"),e=j.selectAll(".arc").data(h(c)).enter().append("g").classed("arc",!0).on("mouseover",function(a,d){return b.dash.select("#"+c[d][0]+"-stat").classed("hidden",!1)}).on("mouseout",function(a,d){return b.dash.select("#"+c[d][0]+"-stat").classed("hidden",!0)}),e.append("path").attr("d",d).attr("stroke",function(a,b){return f(b)}).attr("stroke-width",2).attr("fill-opacity","0.3"),e.append("text").attr("transform",function(a){return"translate("+d.centroid(a)+")"}).attr("id",function(a,b){return""+c[b][0]+"-stat"}).attr("dy",".35em").classed("hidden",!0).text(function(a,b){return c[b][0]}))},update:function(){return b.conf.nodeStats&&this.nodeStats
(),b.conf.edgeStats?this.edgeStats():void 0}}},a.prototype.updateGraph=function(a){var b;return b=a,function(){for(b.generateLayout(),b._drawEdges.createEdge(b.elements.edges.d3),b._drawNodes.createNode(b.elements.nodes.d3),b.layout.positionRootNodes(),b.force.start();b.force.alpha()>.005;)b.force.tick();
-return b.force.on("tick",b.layout.tick).start(),b.elements.nodes.svg.attr("transform",function(a){return"translate("+a.x+", "+a.y+")"})}},a.prototype.defaults={plugins:null,renderer:"svg",graphWidth:function(){return d3.select(this.divSelector).node().parentElement.clientWidth},graphHeight:function(){return"BODY"===d3.select(this.divSelector).node().parentElement.nodeName?window.innerHeight:d3.select(this.divSelector).node().parentElement.clientHeight},alpha:.5,collisionDetection:!0,nodeOverlap:25,fixNodes:!1,fixRootNodes:!1,forceLocked:!0,linkDistancefn:"default",nodePositions:null,showEditor:!1,captionToggle:!1,toggleRootNodes:!1,removeElement:!1,cluster:!1,clusterKey:"cluster",clusterColours:d3.shuffle(["#DD79FF","#FFFC00","#00FF30","#5168FF","#00C0FF","#FF004B","#00CDCD","#f83f00","#f800df","#ff8d8f","#ffcd00","#184fff","#ff7e00"]),clusterControl:!1,nodeStats:!1,edgeStats:!1,edgeFilters:!1,nodeFilters:!1,edgesToggle:!1,nodesToggle:!1,zoomControls:!1,nodeCaption:"caption",nodeCap
tionsOnByDefault:!1,nodeStyle:{all:{radius:10,color:"#68B9FE",borderColor:"#127DC1",borderWidth:function(a,b){return b/3},captionColor:"#FFFFFF",captionBackground:null,captionSize:12,selected:{color:"#FFFFFF",borderColor:"#349FE3"},highlighted:{color:"#EEEEFF"},hidden:{color:"none",borderColor:"none"}}},nodeColour:null,nodeMouseOver:"caption",nodeRadius:10,nodeTypes:null,rootNodes:"root",rootNodeRadius:15,nodeClick:null,edgeCaption:"caption",edgeCaptionsOnByDefault:!1,edgeStyle:{all:{width:4,color:"#CCC",opacity:.2,directed:!0,curved:!0,selected:{opacity:1},highlighted:{opacity:1},hidden:{opacity:0}}},edgeTypes:null,curvedEdges:!1,edgeWidth:function(){return 4},edgeOverlayWidth:20,directedEdges:!1,edgeArrowSize:5,edgeClick:null,search:!1,searchMethod:"contains",backgroundColour:"#000000",theme:null,afterLoad:"afterLoad",divSelector:"#alchemy",dataSource:null,initialScale:1,initialTranslate:[0,0],scaleExtent:[.5,2.4],exportSVG:!1,dataWarning:"default",warningMessage:"There be no data
! What's going on?"},c=function(a){return{a:a,createLink:function(a){var b;return b=this.a.conf,a.append("path").attr("class","edge-line").attr("id",function(a){return"path-"+a.id}),a.filter(function(a){return null!=a.caption}).append("text"),a.append("path").attr("class","edge-handler").style("stroke-width",""+b.edgeOverlayWidth).style("opacity","0")},styleLink:function(a){var b,c,d;return b=this.a,c=this.a.conf,d=this.a.drawing.EdgeUtils,a.each(function(a){var b,e,f,g,h,i,j,k,l;return f=d.edgeWalk(a),e=c.curvedEdges?30:0,b=e/10,k=a.source.radius+a["stroke-width"]/2,l=e/10,j=f.edgeLength/2,g=f.edgeLength-(a.target.radius-a.target["stroke-width"]/2),h=e/10,i=d3.select(this),i.style(d.edgeStyle(a)),i.attr("transform","translate("+a.source.x+", "+a.source.y+") rotate("+f.edgeAngle+")"),i.select(".edge-line").attr("d",function(){var d,f,i;return f="M"+k+","+l+"q"+j+","+e+" "+g+","+h,c.directedEdges?(i=2*a["stroke-width"],d="l"+-i+","+(i+b)+" l"+i+","+(-i-b)+" l"+-i+","+(-i+b),f+d):f}(
)),i.select(".edge-handler").attr("d",function(){return i.select(".edge-line").attr("d")})})},classEdge:function(a){return a.classed("active",!0)},styleText:function(a){var b,c,d;return b=this.a.conf,c=b.curvedEdges,d=this.a.drawing.EdgeUtils,a.select("text").each(function(a){var c,e;return e=d.edgeWalk(a),c=e.edgeLength/2,d3.select(this).attr("dx",""+c).text(a.caption).attr("xlink:xlink:href","#path-"+a.source.id+"-"+a.target.id).style("display",function(){return b.edgeCaptionsOnByDefault?"block":void 0})})},setInteractions:function(a){var b;return b=this.a.interactions,a.select(".edge-handler").on("click",b.edgeClick).on("mouseover",function(a){return b.edgeMouseOver(a)}).on("mouseout",function(a){return b.edgeMouseOut(a)})}}},d=function(a){return{a:a,createEdge:function(a){var b,c;return b=this.a.drawing.DrawEdge,c=this.a.vis.selectAll("g.edge").data(a),c.enter().append("g").attr("id",function(a){return"edge-"+a.id+"-"+a.pos}).attr("class",function(a){return"edge "+a.edgeType}).a
ttr("source-target",function(a){return""+a.source.id+"-"+a.target.id}),b.createLink(c),b.classEdge(c),b.styleLink(c),b.styleText(c),b.setInteractions(c),c.exit().remove(),this.a.conf.directedEdges&&this.a.conf.curvedEdges?c.select(".edge-line").attr("marker-end","url(#arrow)"):void 0},updateEdge:function(a){var b,c;return b=this.a.drawing.DrawEdge,c=this.a.vis.select("#edge-"+a.id+"-"+a.pos),b.classEdge(c),b.styleLink(c),b.styleText(c),b.setInteractions(c)}}},e=function(a){return{a:a,styleText:function(a){var b,c,d;return b=this.a.conf,d=this.a.drawing.NodeUtils,c=this.a._nodes,a.selectAll("text").attr("dy",function(a){return c[a.id].getProperties().root?b.rootNodeRadius/2:2*b.nodeRadius-5}).attr("visibility",function(a){return"hidden"===c[a.id]._state?"hidden":"visible"}).text(function(a){return d.nodeText(a)}).style("display",function(){return b.nodeCaptionsOnByDefault?"block":void 0})},createNode:function(a){return a=_.difference(a,a.select("circle").data()),a.__proto__=d3.select
().__proto__,a.append("circle").attr("id",function(a){return"circle-"+a.id}),a.append("svg:text").attr("id",function(a){return"text-"+a.id})},styleNode:function(a){var b;return b=this.a.drawing.NodeUtils,a.selectAll("circle").attr("r",function(a){return"function"==typeof a.radius?a.radius():a.radius}).each(function(a){return d3.select(this).style(b.nodeStyle(a))})},setInteractions:function(a){var b,c,d,e,f,g,h;return b=this.a.conf,c=this.a.interactions,e="editor"===this.a.get.state("interactions"),d=d3.behavior.drag().origin(Object).on("dragstart",null).on("drag",null).on("dragend",null),e?(f=new this.a.editor.Interactions,a.on("mouseup",function(a){return f.nodeMouseUp(a)}).on("mouseover",function(a){return f.nodeMouseOver(a)}).on("mouseout",function(a){return f.nodeMouseOut(a)}).on("dblclick",function(a){return c.nodeDoubleClick(a)}).on("click",function(a){return f.nodeClick(a)})):(a.on("mouseup",null).on("mouseover",function(a){return c.nodeMouseOver(a)}).on("mouseout",function(a
){return c.nodeMouseOut(a)}).on("dblclick",function(a){return c.nodeDoubleClick(a)}).on("click",function(a){return c.nodeClick(a)}),d=d3.behavior.drag().origin(Object).on("dragstart",c.nodeDragStarted).on("drag",c.nodeDragged).on("dragend",c.nodeDragended),b.fixNodes||(g=a.filter(function(a){return a.root!==!0}),g.call(d)),b.fixRootNodes?void 0:(h=a.filter(function(a){return a.root===!0}),h.call(d)))}}},f=function(a){return{a:a,createNode:function(a){var b,c;return b=this.a.drawing.DrawNode,c=this.a.vis.selectAll("g.node").data(a,function(a){return a.id}),c.enter().append("g").attr("class",function(a){var b;return b=a.self._nodeType,"node "+b+" active"}).attr("id",function(a){return"node-"+a.id}).classed("root",function(a){return a.root}),b.createNode(c),b.styleNode(c),b.styleText(c),b.setInteractions(c),c.exit().remove()},updateNode:function(a){var b,c;return b=this.a.drawing.DrawNode,c=this.a.vis.select("#node-"+a.id),b.styleNode(c),b.styleText(c),b.setInteractions(c)}}},a.prototy
pe.EdgeUtils=function(a){return{a:a,edgeStyle:function(a){var b,c,d,e,f;return c=this.a.conf,d=this.a._edges[a.id][a.pos],f=this.a.svgStyles.edge.update(d),e=this.a._nodes,this.a.conf.cluster&&(b=this.a.layout._clustering,f.stroke=function(a){var d,f,g,h,i,j;return d=c.clusterKey,i=e[a.source.id]._properties,j=e[a.target.id]._properties,i.root||j.root?(h=i.root?j[d]:i[d],""+b.getClusterColour(h)):i[d]===j[d]?(h=i[d],""+b.getClusterColour(h)):i[d]!==j[d]?(g=""+i[d]+"-"+j[d],f="cluster-gradient-"+g,"url(#"+f+")"):void 0}(a)),f},triangle:function(a){var b,c,d;return d=a.target.x-a.source.x,b=a.target.y-a.source.y,c=Math.sqrt(b*b+d*d),[d,b,c]},edgeWalk:function(a){var b,c,d,e,f,g,h,i;return i=this.triangle(a),h=i[0],e=i[1],f=i[2],d=a["stroke-width"],b=2,g=a.source.radius+a.source["stroke-width"]-d/2+b,c=f-g-1.5*b,{edgeAngle:Math.atan2(e,h)/Math.PI*180,edgeLength:c}},middleLine:function(a){return this.curvedDirectedEdgeWalk(a,"middle")},startLine:function(a){return this.curvedDirectedEdg
eWalk(a,"linkStart")},endLine:function(a){return this.curvedDirectedEdgeWalk(a,"linkEnd")},edgeLength:function(a){var b,c,d;return d=a.target.x-a.source.x,b=a.target.y-a.source.y,c=Math.sqrt(b*b+d*d)},edgeAngle:function(a){var b,c;return c=a.target.x-a.source.x,b=a.target.y-a.source.y,Math.atan2(b,c)/Math.PI*180},captionAngle:function(a){return-90>a||a>90?180:0},middlePath:function(a){var b,c;return c=this.a.vis.select("#path-"+a.id).node(),b=c.getPointAtLength(c.getTotalLength()/2),{x:b.x,y:b.y}},middlePathCurve:function(a){var b,c;return c=d3.select("#path-"+a.id).node(),b=c.getPointAtLength(c.getTotalLength()/2),{x:b.x,y:b.y}}}},a.prototype.NodeUtils=function(a){var b;return b=a,{nodeStyle:function(a){var c,d;return c=b.conf,d=a.self,c.cluster&&"hidden"!==d._state&&(a.fill=function(){var a,e,f,g,h,i,j;return e=b.layout._clustering,j=d.getProperties(),a=e.clusterMap,i=c.clusterKey,h=c.clusterColours,g=a[j[i]]%h.length,f=h[g],""+f}(a),a.stroke=a.fill),a},nodeText:function(a){var c,
d,e;return d=b.conf,e=b._nodes[a.id]._properties,d.nodeCaption&&"string"==typeof d.nodeCaption?null!=e[d.nodeCaption]?e[d.nodeCaption]:"":d.nodeCaption&&"function"==typeof d.nodeCaption?(c=d.nodeCaption(e),(void 0===c||"undefined"===String(c))&&(b.log.caption="At least one caption returned undefined",d.caption=!1),c):void 0}}},a.prototype.svgStyles=function(a){return{a:a,node:{a:this.a,populate:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;return b=this.a.conf,d=_.omit(b.nodeStyle.all,"selected","highlighted","hidden"),c=a,m=function(a){return"function"==typeof a?a:function(){return a}},g=_.keys(b.nodeTypes)[0],f=a.getProperties()[g],void 0===b.nodeStyle[f]&&(f="all"),n=_.assign(_.cloneDeep(d),b.nodeStyle[f]),k=_.assign(n,b.nodeStyle[f][a._state]),h=m(k.radius),e=m(k.color),i=m(k.borderColor),j=m(k.borderWidth),l={},l.radius=h(c),l.fill=e(c),l.stroke=i(c),l["stroke-width"]=j(c,h(c)),l}},edge:{a:this.a,populate:function(a){var b,c,d,e,f,g,h,i,j,k;return c=this.a.conf,d=_.omit(c.edgeStyle
.all,"selected","highlighted","hidden"),i=function(a){return"function"==typeof a?a:function(){return a}},e=a._edgeType,void 0===c.edgeStyle[e]&&(e="all"),j=_.assign(_.cloneDeep(d),c.edgeStyle[e]),g=_.assign(j,c.edgeStyle[e][a._state]),k=i(g.width),b=i(g.color),f=i(g.opacity),h={stroke:b(a),"stroke-width":k(a),opacity:f(a),fill:"none"}},update:function(a){var b,c,d,e,f,g,h;return c=this.a.conf,e=a._style,g=function(a){return"function"==typeof a?a:function(){return a}},h=g(e.width),b=g(e.color),d=g(e.opacity),f={stroke:b(a),"stroke-width":h(a),opacity:d(a),fill:"none"}}}}},g=function(){function a(){this.nodeEditor=n(this.nodeEditor,this),this.startEditor=n(this.startEditor,this),this.utils=new alchemy.editor.Utils}return a.prototype.editorContainerHTML='<div id="editor-header" data-toggle="collapse" data-target="#editor #element-options">\n <h3>Editor</h3><span class="fa fa-2x fa-caret-right"></span>\n</div>\n<div id="element-options" class="collapse">\n <ul class="list-group">
\n <li class="list-group-item" id="remove">Remove Selected</li> \n <li class="list-group-item" id="editor-interactions">Editor mode enabled, click to disable editor interactions</li>\n </ul>\n</div>',a.prototype.elementEditorHTML=function(a){return"<h4>"+a+' Editor</h4>\n<form id="add-property-form">\n <div id="add-property">\n <input class="form-control" id="add-prop-key" placeholder="New Property Name">\n <input class="form-control" id="add-prop-value" placeholder="New Property Value">\n </div>\n <input id="add-prop-submit" type="submit" value="Add Property" placeholder="add a property to this node">\n</form>\n<form id="properties-list">\n <input id="update-properties" type="submit" value="Update Properties">\n</form>'},a.prototype.startEditor=function(){var a,b,c,d,e;return a=alchemy.conf.divSelector,d=this.editorContainerHTML,b=alchemy.dash.select("#control-dash").append("div").attr("id","editor").html(d),b.select("#editor-header").on("
click",function(){return alchemy.dash.select("#element-options").classed("in")?alchemy.dash.select("#editor-header>span").attr("class","fa fa-2x fa-caret-right"):alchemy.dash.select("#editor-header>span").attr("class","fa fa-2x fa-caret-down")}),c=b.select("#element-options ul #editor-interactions").on("click",function(){return d3.select(this).attr("class",function(){return"editor"===alchemy.get.state()?(alchemy.set.state("interactions","default"),"inactive list-group-item"):(alchemy.set.state("interactions","editor"),"active list-group-item")}).html(function(){return"editor"===alchemy.get.state()?"Disable Editor Interactions":"Enable Editor Interactions"})}),b.select("#element-options ul #remove").on("click",function(){return alchemy.editor.remove()}),e=this.utils,c.on("click",function(){return alchemy.dash.select("#editor-interactions").classed("active")?(e.disableEditor(),alchemy.dash.select("#editor-interactions").classed({active:!1,inactive:!0}).html("Editor mode disabled, clic
k to enable editor interactions")):(e.enableEditor(),alchemy.dash.select("#editor-interactions").classed({active:!0,inactive:!1}).html("Editor mode enabled, click to disable editor interactions"))})},a.prototype.nodeEditor=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;c=alchemy.conf.divSelector,d=alchemy.dash.select("#control-dash #editor"),i=d.select("#element-options"),f=this.elementEditorHTML("Node"),e=i.append("div").attr("id","node-editor").html(f),e.attr("class",function(){var a;return a=alchemy.dash.select("#editor-interactions").classed("active"),a?"enabled":"hidden"}),b=d.select("#node-editor form #add-property"),b.select("#node-add-prop-key").attr("placeholder","New Property Name").attr("value",null),b.select("#node-add-prop-value").attr("placeholder","New Property Value").attr("value",null),alchemy.dash.select("#add-property-form").on("submit",function(){var a,b;return event.preventDefault(),a=alchemy.dash.select("#add-prop-key").property("value"),a=a.replace(/\s/g,"_"),b=alche
my.dash.select("#add-prop-value").property("value"),l(a,b,!0),alchemy.dash.selectAll("#add-property .edited-property").classed({"edited-property":!1}),this.reset()}),g=alchemy._nodes[a.id].getProperties(),alchemy.vis.select("#node-"+a.id).classed({editing:!0}),k=d.select("#node-editor #properties-list");for(j in g)m=g[j],h=k.append("div").attr("id","node-"+j).attr("class","property form-inline form-group"),h.append("label").attr("for","node-"+j+"-input").attr("class","form-control property-name").text(""+j),h.append("input").attr("id","node-"+j+"-input").attr("class","form-control property-value").attr("value",""+m);return alchemy.dash.select("#properties-list").on("submit",function(){var a,b,c,d,e,f,g;for(event.preventDefault(),b=alchemy.dash.selectAll(".edited-property"),g=b[0],e=0,f=g.length;f>e;e++)j=g[e],c=alchemy.dash.select(j),a=c.select("label").text(),d=c.select("input").attr("value"),l(a,d,!1);return alchemy.dash.selectAll("#node-properties-list .edited-property").classed(
{"edited-property":!1}),this.reset()}),d3.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown",function(){return 13===d3.event.keyCode&&event.preventDefault(),d3.select(this).classed({"edited-property":!0})}),l=function(b,c,d){var e,f;return f=a.id,""!==b&&""!==c?(alchemy._nodes[f].setProperty(""+b,""+c),e=alchemy._drawNodes,e.updateNode(alchemy.viz.select("#node-"+f)),d===!0?(alchemy.dash.select("#node-add-prop-key").attr("value","property added/updated to key: "+b),alchemy.dash.select("#node-add-prop-value").attr("value","property at "+b+" updated to: "+c)):alchemy.dash.select("#node-"+b+"-input").attr("value","property at "+b+" updated to: "+c)):d===!0?(alchemy.dash.select("#node-add-prop-key").attr("value","null or invalid input"),alchemy.dash.select("#node-add-prop-value").attr("value","null or invlid input")):alchemy.dash.select("#node-"+b+"-input").attr("value","null or invalid input")}},a.prototype.editorClear=function(){return alchemy.dash.selectAll(".node").
classed({editing:!1}),alchemy.dash.selectAll(".edge").classed({editing:!1}),alchemy.dash.select("#node-editor").remove(),alchemy.dash.select("#edge-editor").remove(),alchemy.dash.select("#node-add-prop-submit").attr("placeholder",function(){return alchemy.vis.selectAll(".selected").empty()?"select a node or edge to edit properties":"add a property to this element"})},a.prototype.edgeEditor=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;c=alchemy.conf.divSelector,f=alchemy.dash("#control-dash #editor"),i=f.select("#element-options"),h=this.elementEditorHTML("Edge"),g=i.append("div").attr("id","edge-editor").html(h),g.attr("class",function(){return alchemy.dash.select("#editor-interactions").classed("active")?"enabled":"hidden"}),b=f.select("#edge-editor form #add-property"),b.select("#add-prop-key").attr("placeholder","New Property Name").attr("value",null),b.select("#add-prop-value").attr("placeholder","New Property Value").attr("value",null),d=alchemy._edges[a.id].getProperties(),alchemy.
vis.select("#edge-"+a.id).classed({editing:!0}),k=f.select("#edge-editor #properties-list");for(j in d)m=d[j],e=k.append("div").attr("id","edge-"+j).attr("class","property form-inline form-group"),e.append("label").attr("for","edge-"+j+"-input").attr("class","form-control property-name").text(""+j),e.append("input").attr("id","edge-"+j+"-input").attr("class","form-control property-value").attr("value",""+m);return alchemy.dash.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown",function(){return 13===d3.event.keyCode&&event.preventDefault(),d3.select(this).classed({"edited-property":!0})}),alchemy.dash.select("#add-property-form").on("submit",function(){var a,b;return event.preventDefault(),a=alchemy.dash.select("#add-prop-key").property("value"),a=a.replace(/\s/g,"_"),b=alchemy.dash.select("#add-prop-value").property("value"),l(a,b,!0),alchemy.dash.selectAll("#add-property .edited-property").classed({"edited-property":!1}),this.reset()}),d3.select("#properties-list"
).on("submit",function(){var a,b,c,d,e,f,g;for(event.preventDefault(),b=alchemy.dash.selectAll(".edited-property"),g=b[0],e=0,f=g.length;f>e;e++)j=g[e],c=alchemy.dash.select(j),a=c.select("label").text(),d=c.select("input").property("value"),l(a,d,!1);return alchemy.dash.selectAll("#properties-list .edited-property").classed({"edited-property":!1}),this.reset()}),l=function(b,c,d){var e,f,g;return f=a.id,""!==b&&""!==c?(alchemy._edges[f].setProperty(""+b,""+c),g=alchemy.vis.select("#edge-"+f),e=new alchemy.drawing.DrawEdges,e.updateEdge(alchemy.vis.select("#edge-"+f)),d===!0?(alchemy.dash.select("#add-prop-key").attr("value","property added/updated to key: "+b),alchemy.dash.select("#add-prop-value").attr("value","property at "+b+" updated to: "+c)):alchemy.dash.select("#edge-"+b+"-input").attr("value","property at "+b+" updated to: "+c)):d===!0?(alchemy.dash.select("#add-prop-key").attr("value","null or invalid input"),alchemy.dash.select("#add-prop-value").attr("value","null or inv
lid input")):alchemy.dash.select("#edge-"+b+"-input").attr("value","null or invalid input")}},a}(),h=function(){function a(){this.reset=n(this.reset,this),this.deleteSelected=n(this.deleteSelected,this),this.addNodeDragended=n(this.addNodeDragended,this),this.addNodeDragging=n(this.addNodeDragging,this),this.addNodeStart=n(this.addNodeStart,this),this.edgeClick=n(this.edgeClick,this),this.nodeClick=n(this.nodeClick,this),this.nodeMouseUp=n(this.nodeMouseUp,this),this.editor=new alchemy.editor.Editor}return a.prototype.nodeMouseOver=function(){var a;return d3.select(this).select("circle").empty()||(a=d3.select(this).select("circle").attr("r"),d3.select(this).select("circle").attr("r",3*a)),this},a.prototype.nodeMouseUp=function(a){return this.sourceNode!==a?(this.mouseUpNode=!0,this.targetNode=a,this.click=!1):this.click=!0,this},a.prototype.nodeMouseOut=function(){var a;return d3.select(this).select("circle").empty()||(a=d3.select(this).select("circle").attr("r"),d3.select(this).sel
ect("circle").attr("r",a/3)),this},a.prototype.nodeClick=function(a){var b;return d3.event.stopPropagation(),alchemy.vis.select("#node-"+a.id).empty()||(b=alchemy.vis.select("#node-"+a.id).classed("selected"),alchemy.vis.select("#node-"+a.id).classed("selected",!b)),this.editor.editorClear(),this.editor.nodeEditor(a)},a.prototype.edgeClick=function(a){return d3.event.stopPropagation(),this.editor.editorClear(),this.editor.edgeEditor(a)},a.prototype.addNodeStart=function(a){return d3.event.sourceEvent.stopPropagation(),this.sourceNode=a,alchemy.vis.select("#dragline").classed({hidden:!1}),this},a.prototype.addNodeDragging=function(){var a,b;return a=d3.event.x,b=d3.event.y,alchemy.vis.select("#dragline").attr("x1",this.sourceNode.x).attr("y1",this.sourceNode.y).attr("x2",a).attr("y2",b).attr("style","stroke: #FFF"),this},a.prototype.addNodeDragended=function(){var a,b,c;return this.click||(this.mouseUpNode||(a=alchemy.vis.select("#dragline"),b=a.attr("x2"),c=a.attr("y2"),this.targetN
ode={id:""+_.uniqueId("addedNode_"),x:parseFloat(b),y:parseFloat(c),caption:"node added"}),this.newEdge={id:""+this.sourceNode.id+"-"+this.targetNode.id,source:this.sourceNode.id,target:this.targetNode.id,caption:"edited"},alchemy.editor.update(this.targetNode,this.newEdge)),this.reset(),this},a.prototype.deleteSelected=function(){switch(d3.event.keyCode){case 8:case 46:if("INPUT"!==d3.select(d3.event.target).node().tagName)return d3.event.preventDefault(),alchemy.editor.remove()}},a.prototype.reset=function(){return this.mouseUpNode=null,this.sourceNode=null,this.targetNode=null,this.newEdge=null,this.click=null,alchemy.vis.select("#dragline").classed({hidden:!0}).attr("x1",0).attr("y1",0).attr("x2",0).attr("y2",0),this},a}(),i=function(){function a(){this.enableEditor=n(this.enableEditor,this),this.drawNodes=alchemy._drawNodes,this.drawEdges=alchemy._drawEdges}return a.prototype.enableEditor=function(){var a,b,c;return alchemy.set.state("interactions","editor"),a=alchemy.vis.appen
d("line").attr("id","dragline"),this.drawNodes.updateNode(alchemy.node),this.drawEdges.updateEdge(alchemy.edge),c=alchemy.vis.selectAll(".selected"),b=new alchemy.editor.Editor,c.empty()||1!==c.length?c.classed({selected:!1}):c.classed("node")?(b.nodeEditor(c.datum()),alchemy.dash.select("#node-editor").attr("class","enabled").style("opacity",1)):c.classed("edge")?(b.edgeEditor(c.datum()),alchemy.dash.select("#edge-editor").attr("class","enabled").style("opacity",1)):void 0},a.prototype.disableEditor=function(){return alchemy.setState("interactions","default"),alchemy.vis.select("#dragline").remove(),alchemy.dash.select("#node-editor").transition().duration(300).style("opacity",0),alchemy.dash.select("#node-editor").transition().delay(300).attr("class","hidden"),this.drawNodes.updateNode(alchemy.node),alchemy.vis.selectAll(".node").classed({selected:!1})},a.prototype.remove=function(){var a,b,c,d,e,f,g,h,i,j,k,l;for(e=alchemy.vis.selectAll(".selected.node"),j=e[0],l=[],f=0,h=j.lengt
h;h>f;f++)if(b=j[f],c=alchemy.vis.select(b).data()[0].id,d=alchemy._nodes[c],null!=d){for(k=d.adjacentEdges,g=0,i=k.length;i>g;g++)a=k[g],alchemy._edges=_.omit(alchemy._edges,""+a.id+"-"+a._index),alchemy.edge=alchemy.edge.data(_.map(alchemy._edges,function(a){return a._d3}),function(a){return a.id}),alchemy.vis.select("#edge-"+a.id+"-"+a._index).remove();alchemy._nodes=_.omit(alchemy._nodes,""+c),alchemy.node=alchemy.node.data(_.map(alchemy._nodes,function(a){return a._d3}),function(a){return a.id}),alchemy.vis.select(b).remove(),l.push("editor"===alchemy.get.state("interactions")?alchemy.modifyElements.nodeEditorClear():void 0)}else l.push(void 0);return l},a.prototype.addNode=function(a){var b;return b=alchemy._nodes[a.id]=new alchemy.models.Node({id:""+a.id}),b.setProperty("caption",a.caption),b.setD3Property("x",a.x),b.setD3Property("y",a.y),alchemy.node=alchemy.node.data(_.map(alchemy._nodes,function(a){return a._d3}),function(a){return a.id})},a.prototype.addEdge=function(a){
var b;return b=alchemy._edges[a.id]=new alchemy.models.Edge(a),alchemy.edge=alchemy.edge.data(_.map(alchemy._edges,function(a){return a._d3}),function(a){return a.id})},a.prototype.update=function(a,b){return this.mouseUpNode?(alchemy.editor.addEdge(b),this.drawEdges.createEdge(alchemy.edge)):(alchemy.editor.addNode(a),alchemy.editor.addEdge(b),this.drawEdges.createEdge(alchemy.edge),this.drawNodes.createNode(alchemy.node)),alchemy.layout.tick()},a}(),a.prototype.Edge=function(a){var b;return b=function(){function b(b,c){var d;null==c&&(c=null),this.allNodesActive=n(this.allNodesActive,this),this.setProperties=n(this.setProperties,this),this.getStyles=n(this.getStyles,this),this.setProperties=n(this.setProperties,this),this.getProperties=n(this.getProperties,this),this._setID=n(this._setID,this),this._setD3Properties=n(this._setD3Properties,this),this.a=a,d=this.a.conf,this.id=this._setID(b),this._index=c,this._state="active",this._properties=b,this._edgeType=this._setEdgeType(),thi
s._style=null!=d.edgeStyle[this._edgeType]?_.merge(_.clone(d.edgeStyle.all),d.edgeStyle[this._edgeType]):_.clone(d.edgeStyle.all),this._d3=_.merge({id:this.id,pos:this._index,edgeType:this._edgeType,source:this.a._nodes[this._properties.source]._d3,target:this.a._nodes[this._properties.target]._d3,self:this},this.a.svgStyles.edge.populate(this)),this._setCaption(b,d),this.a._nodes[""+b.source]._addEdge(this),this.a._nodes[""+b.target]._addEdge(this)}return b.prototype._setD3Properties=function(a){return _.merge(this._d3,a)},b.prototype._setID=function(a){return null!=a.id?a.id:""+a.source+"-"+a.target},b.prototype._setCaption=function(a,b){var c,d;return c=b.edgeCaption,d=function(a){switch(typeof c){case"string":return a[c];case"function":return c(a)}}(a),d?this._d3.caption=d:void 0},b.prototype._setEdgeType=function(){var a,b,c;return a=this.a.conf,a.edgeTypes&&(_.isPlainObject(a.edgeTypes)?(c=Object.keys(this.a.conf.edgeTypes),b=this._properties[c]):_.isArray(a.edgeTypes)?b=this.
_properties.caption:"string"==typeof a.edgeTypes&&(b=this._properties[a.edgeTypes])),void 0===b&&(b="all"),this._setD3Properties("edgeType",b),b},b.prototype.getProperties=function(){var a,b,c;return a=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],null==a&&(a=null),null==a&&0===b.length?this._properties:0!==b.length?(c=_.union([a],b),_.pick(this._properties,c)):this._properties[a]},b.prototype.setProperties=function(a,b){return null==b&&(b=null),_.isPlainObject(a)?(_.assign(this._properties,a),"source"in a&&this._setD3Properties({source:alchemy._nodes[a.source]._d3}),"target"in a&&this._setD3Properties({target:alchemy._nodes[a.target]._d3})):(this._properties[a]=b,("source"===a||"target"===a)&&this._setD3Properties({property:alchemy._nodes[b]._d3})),this},b.prototype.getStyles=function(){var a,b,c;return b=arguments[0],c=2<=arguments.length?m.call(arguments,1):[],a=this,void 0===b?a._style:_.map(arguments,function(b){return a._style[b]})},b.prototype.setProperties=functi
on(a,b){return null==b&&(b=null),_.isPlainObject(a)?(_.assign(this._properties,a),"source"in a&&this._setD3Properties({source:this.a._nodes[a.source]._d3}),"target"in a&&this._setD3Properties({target:this.a._nodes[a.target]._d3})):(this._properties[a]=b,("source"===a||"target"===a)&&this._setD3Properties({property:this.a._nodes[b]._d3})),this},b.prototype.setStyles=function(a,b){return null==b&&(b=null),void 0===a&&(a=this.a.svgStyles.edge.populate(this)),_.isPlainObject(a)?_.assign(this._style,a):"string"==typeof a&&(this._style[a]=b),this._setD3Properties(this.a.svgStyles.edge.update(this)),this.a._drawEdges.updateEdge(this._d3),this},b.prototype.toggleHidden=function(){return this._state="hidden"===this._state?"active":"hidden",this.setStyles()},b.prototype.allNodesActive=function(){var a,b,c,d;return a=this._properties.source,c=this._properties.target,b=alchemy.get.nodes(a)[0],d=alchemy.get.nodes(c)[0],"active"===b._state&&"active"===d._state},b.prototype.remove=function(){var a
,b;return a=this,delete this.a._edges[a.id],null!=this.a._nodes[a._properties.source]&&_.remove(this.a._nodes[a._properties.source]._adjacentEdges,function(b){return b.id===a.id?b:void 0}),null!=this.a._nodes[a._properties.target]&&_.remove(this.a._nodes[a._properties.target]._adjacentEdges,function(b){return b.id===a.id?b:void 0}),this.a.vis.select("#edge-"+a.id+"-"+a._index).remove(),b=_.filter(this.a.force.links(),function(b){return b.id!==a.id?b:void 0}),this.a.force.links(b)},b}()},a.prototype.Node=function(a){var b;return b=function(){function b(b){this.getStyles=n(this.getStyles,this),this.setProperty=n(this.setProperty,this),this.getProperties=n(this.getProperties,this),this._setD3Properties=n(this._setD3Properties,this),this._setNodeType=n(this._setNodeType,this);var c;this.a=a,c=this.a.conf,this.id=b.id,this._properties=b,this._d3=_.merge({id:this.id,root:this._properties[c.rootNodes],self:this},this.a.svgStyles.node.populate(this)),this._nodeType=this._setNodeType(),this.
_style=c.nodeStyle[this._nodeType]?c.nodeStyle[this._nodeType]:c.nodeStyle.all,this._state="active",this._adjacentEdges=[]}return b.prototype._setNodeType=function(){var a,b,c,d;return a=this.a.conf,a.nodeTypes&&(_.isPlainObject(a.nodeTypes)?(b=Object.keys(this.a.conf.nodeTypes),d=_.values(a.nodeTypes),c=this._properties[b]):"string"==typeof a.nodeTypes&&(c=this._properties[a.nodeTypes])),void 0===c&&(c="all"),this._setD3Properties("nodeType",c),c},b.prototype._setD3Properties=function(a){return _.merge(this._d3,a)},b.prototype._addEdge=function(a){return this._adjacentEdges=_.union(this._adjacentEdges,[a])},b.prototype.getProperties=function(){var a,b,c;return a=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],null==a&&(a=null),null==a&&0===b.length?this._properties:0!==b.length?(c=_.union([a],b),_.pick(this._properties,c)):this._properties[a]},b.prototype.setProperty=function(a,b){return null==b&&(b=null),_.isPlainObject(a)?_.assign(this._properties,a):this._properties[a]
=b,this},b.prototype.removeProperty=function(){var a,b,c,d,e;for(c=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],d=0,e=arguments.length;e>d;d++)a=arguments[d],delete this._properties[a];return this},b.prototype.getStyles=function(){var a,b,c;return a=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],c=this,void 0===a?c._style:_.map(arguments,function(a){return c._style[a]})},b.prototype.setStyles=function(a,b){return null==b&&(b=null),void 0===a?a=this.a.svgStyles.node.populate(this):_.isPlainObject(a)?_.assign(this._style,a):this._style[a]=b,this._setD3Properties(this.a.svgStyles.node.populate(this)),this.a._drawNodes.updateNode(this._d3),this},b.prototype.toggleHidden=function(){var a;return a=this.a,this._state="hidden"===this._state?"active":"hidden",this.setStyles(),_.each(this._adjacentEdges,function(b){var c,d,e,f,g;return g=b.id.split("-"),c=g[0],e=g[1],d=a._nodes[""+c]._state,f=a._nodes[""+e]._state,"hidden"===b._state&&"active"===d&&"active"===f?b.toggl
eHidden():"active"!==b._state||"hidden"!==d&&"hidden"!==f?void 0:b.toggleHidden()})},b.prototype.outDegree=function(){return this._adjacentEdges.length},b.prototype.remove=function(){for(;!_.isEmpty(this._adjacentEdges);)this._adjacentEdges[0].remove();return delete this.a._nodes[this.id],this.a.vis.select("#node-"+this.id).remove()},b}()},a.prototype.plugins=function(b){return{init:function(){return _.each(_.keys(b.conf.plugins),function(c){return b.plugins[c]=a.prototype.plugins[c](b),null!=b.plugins[c].init?b.plugins[c].init():void 0})}}},a.prototype.themes={"default":{backgroundColour:"#000000",nodeStyle:{all:{radius:function(){return 10},color:function(){return"#68B9FE"},borderColor:function(){return"#127DC1"},borderWidth:function(a,b){return b/3},captionColor:function(){return"#FFFFFF"},captionBackground:function(){return null},captionSize:12,selected:{color:function(){return"#FFFFFF"},borderColor:function(){return"#349FE3"}},highlighted:{color:function(){return"#EEEEFF"}},hid
den:{color:function(){return"none"},borderColor:function(){return"none"}}}},edgeStyle:{all:{width:4,color:"#CCC",opacity:.2,directed:!0,curved:!0,selected:{opacity:1},highlighted:{opacity:1},hidden:{opacity:0}}}},white:{theme:"white",backgroundColour:"#FFFFFF",nodeStyle:{all:{radius:function(){return 10
-},color:function(){return"#68B9FE"},borderColor:function(){return"#127DC1"},borderWidth:function(a,b){return b/3},captionColor:function(){return"#FFFFFF"},captionBackground:function(){return null},captionSize:12,selected:{color:function(){return"#FFFFFF"},borderColor:function(){return"38DD38"}},highlighted:{color:function(){return"#EEEEFF"}},hidden:{color:function(){return"none"},borderColor:function(){return"none"}}}},edgeStyle:{all:{width:4,color:"#333",opacity:.4,directed:!1,curved:!1,selected:{color:"#38DD38",opacity:.9},highlighted:{color:"#383838",opacity:.7},hidden:{opacity:0}}}}},a.prototype.exports=function(a){var b;return b=a,{init:function(){return b.exports.show()},show:function(){return b.dash.select("#all-exports").append("li").attr({"class":"list-group-item active-label toggle"}).html("SVG").on("click",function(){var a,c,d,e,f;return d=d3.select(""+b.conf.divSelector+" svg").node(),c=(new XMLSerializer).serializeToString(d),e="data:image/svg+xml;utf8,"+c,a=e.replace("
xlink:",""),f=window.open(a),f.focus()})}}},l=function(){function a(a){this.dataWarning=n(this.dataWarning,this),this.a=a}return a.prototype.dataWarning=function(){return this.a.conf.dataWarning&&"function"==typeof this.a.conf.dataWarning?this.a.conf.dataWarning():"default"===this.a.conf.dataWarning?console.log("No dataSource was loaded"):void 0},a.prototype.divWarning=function(){return"create an element that matches the value for 'divSelector' in your conf.\nFor instance, if you are using the default 'divSelector' conf, simply provide\n<div id='#alchemy'></div>."},a}()}).call(this);
\ No newline at end of file
[52/59] [abbrv] isis git commit: ISIS-789: removing neoapp example
after all
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror-neo.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror-neo.css b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror-neo.css
deleted file mode 100644
index b11d9d8..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror-neo.css
+++ /dev/null
@@ -1,25 +0,0 @@
-.code-style,#editor .cm-s-neo{font-family:Menlo,"Courier New",Terminal,monospace;font-size:16px;line-height:23px;-webkit-font-smoothing:initial}
-.cm-s-neo,.cm-s-neo.cm-s-css{color:#2e383c;}
-.cm-s-neo .cm-comment,.cm-s-neo.cm-s-css .cm-comment{color:#75787b}
-.cm-s-neo .cm-keyword,.cm-s-neo.cm-s-css .cm-keyword,.cm-s-neo .cm-property,.cm-s-neo.cm-s-css .cm-property{color:#1d75b3}
-.cm-s-neo .cm-atom,.cm-s-neo.cm-s-css .cm-atom,.cm-s-neo .cm-number,.cm-s-neo.cm-s-css .cm-number{color:#75438a}
-.cm-s-neo .cm-node,.cm-s-neo.cm-s-css .cm-node,.cm-s-neo .cm-tag,.cm-s-neo.cm-s-css .cm-tag{color:#9c3328}
-.cm-s-neo .cm-string,.cm-s-neo.cm-s-css .cm-string{color:#b35e14}
-.cm-s-neo .cm-variable,.cm-s-neo.cm-s-css .cm-variable,.cm-s-neo .cm-qualifier,.cm-s-neo.cm-s-css .cm-qualifier{color:#047d65}
-#grass .cm-s-neo{font-size:14px;line-height:18px}
-#editor .cm-s-neo{background-color:transparent;margin:25px 180px 25px 16px;-webkit-transition:all 0.4s;-moz-transition:all 0.4s;-o-transition:all 0.4s;-ms-transition:all 0.4s;transition:all 0.4s;-webkit-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-moz-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-o-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-ms-transition-timing-function:cubic-bezier(.694,.0482,.335,1);transition-timing-function:cubic-bezier(.694,.0482,.335,1);}
-#editor .cm-s-neo pre{padding:0}
-#editor .cm-s-neo .cm-s-neo-placeholder{color:#e0e2e6}
-#editor .cm-s-neo-lines{padding:0}
-#editor .cm-s-neo-gutters{border:none;border-right:10px solid transparent;background-color:transparent}
-#editor .cm-s-neo-linenumber{padding:0;color:#e0e2e5;opacity:1;-ms-filter:none;filter:none}
-#editor .cm-s-neo{height:auto}
-#editor .cm-s-neo-scroll{overflow:hidden;max-height:140px}
-#editor .cm-s-neo div.cm-s-neo-cursor{border-left:11px solid rgba(155,157,162,0.37);z-index:3}
-#editor .cm-s-neo-sizer{-webkit-transition:min-height 0.4s;-moz-transition:min-height 0.4s;-o-transition:min-height 0.4s;-ms-transition:min-height 0.4s;transition:min-height 0.4s;-webkit-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-moz-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-o-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-ms-transition-timing-function:cubic-bezier(.694,.0482,.335,1);transition-timing-function:cubic-bezier(.694,.0482,.335,1)}
-#editor .cm-s-neo-scroll div:nth-child(2){-webkit-transition:top 0.4s;-moz-transition:top 0.4s;-o-transition:top 0.4s;-ms-transition:top 0.4s;transition:top 0.4s;-webkit-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-moz-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-o-transition-timing-function:cubic-bezier(.694,.0482,.335,1);-ms-transition-timing-function:cubic-bezier(.694,.0482,.335,1);transition-timing-function:cubic-bezier(.694,.0482,.335,1)}
-#editor .prompt{position:absolute;top:24px;left:25px;color:#93969b;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0)}
-#editor .one-line .prompt{opacity:1;-ms-filter:none;filter:none}
-#editor .one-line .cm-s-neo .cm-s-neo-linenumber{opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0)}
-#editor .disable-highlighting .cm-s-neo .cm-s-neo-code *{color:#7b7f89}
-
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror.css b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror.css
deleted file mode 100644
index 23eaf74..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/codemirror.css
+++ /dev/null
@@ -1,263 +0,0 @@
-/* BASICS */
-
-.CodeMirror {
- /* Set height, width, borders, and global font properties here */
- font-family: monospace;
- height: 300px;
-}
-.CodeMirror-scroll {
- /* Set scrolling behaviour here */
- overflow: auto;
-}
-
-/* PADDING */
-
-.CodeMirror-lines {
- padding: 4px 0; /* Vertical padding around content */
-}
-.CodeMirror pre {
- padding: 0 4px; /* Horizontal padding of content */
-}
-
-.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
- background-color: white; /* The little square between H and V scrollbars */
-}
-
-/* GUTTER */
-
-.CodeMirror-gutters {
- border-right: 1px solid #ddd;
- background-color: #f7f7f7;
- white-space: nowrap;
-}
-.CodeMirror-linenumbers {}
-.CodeMirror-linenumber {
- padding: 0 3px 0 5px;
- min-width: 20px;
- text-align: right;
- color: #999;
-}
-
-/* CURSOR */
-
-.CodeMirror div.CodeMirror-cursor {
- border-left: 1px solid black;
- z-index: 3;
-}
-/* Shown when moving in bi-directional text */
-.CodeMirror div.CodeMirror-secondarycursor {
- border-left: 1px solid silver;
-}
-.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
- width: auto;
- border: 0;
- background: #7e7;
- z-index: 1;
-}
-/* Can style cursor different in overwrite (non-insert) mode */
-.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
-
-.cm-tab { display: inline-block; }
-
-/* DEFAULT THEME */
-
-.cm-s-default .cm-keyword {color: #708;}
-.cm-s-default .cm-atom {color: #219;}
-.cm-s-default .cm-number {color: #164;}
-.cm-s-default .cm-def {color: #00f;}
-.cm-s-default .cm-variable {color: black;}
-.cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
-.cm-s-default .cm-property {color: black;}
-.cm-s-default .cm-operator {color: black;}
-.cm-s-default .cm-comment {color: #a50;}
-.cm-s-default .cm-string {color: #a11;}
-.cm-s-default .cm-string-2 {color: #f50;}
-.cm-s-default .cm-meta {color: #555;}
-.cm-s-default .cm-qualifier {color: #555;}
-.cm-s-default .cm-builtin {color: #30a;}
-.cm-s-default .cm-bracket {color: #997;}
-.cm-s-default .cm-tag {color: #170;}
-.cm-s-default .cm-attribute {color: #00c;}
-.cm-s-default .cm-header {color: blue;}
-.cm-s-default .cm-quote {color: #090;}
-.cm-s-default .cm-hr {color: #999;}
-.cm-s-default .cm-link {color: #00c;}
-
-.cm-negative {color: #d44;}
-.cm-positive {color: #292;}
-.cm-header, .cm-strong {font-weight: bold;}
-.cm-em {font-style: italic;}
-.cm-link {text-decoration: underline;}
-
-.cm-s-default .cm-error {color: #f00;}
-.cm-invalidchar {color: #f00;}
-
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
-.CodeMirror-activeline-background {background: #e8f2ff;}
-
-/* STOP */
-
-/* The rest of this file contains styles related to the mechanics of
- the editor. You probably shouldn't touch them. */
-
-.CodeMirror {
- line-height: 1;
- position: relative;
- overflow: hidden;
- background: white;
- color: black;
-}
-
-.CodeMirror-scroll {
- /* 30px is the magic margin used to hide the element's real scrollbars */
- /* See overflow: hidden in .CodeMirror */
- margin-bottom: -30px; margin-right: -30px;
- padding-bottom: 30px; padding-right: 30px;
- height: 100%;
- outline: none; /* Prevent dragging from highlighting the element */
- position: relative;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-.CodeMirror-sizer {
- position: relative;
-}
-
-/* The fake, visible scrollbars. Used to force redraw during scrolling
- before actuall scrolling happens, thus preventing shaking and
- flickering artifacts. */
-.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
- position: absolute;
- z-index: 6;
- display: none;
-}
-.CodeMirror-vscrollbar {
- right: 0; top: 0;
- overflow-x: hidden;
- overflow-y: scroll;
-}
-.CodeMirror-hscrollbar {
- bottom: 0; left: 0;
- overflow-y: hidden;
- overflow-x: scroll;
-}
-.CodeMirror-scrollbar-filler {
- right: 0; bottom: 0;
-}
-.CodeMirror-gutter-filler {
- left: 0; bottom: 0;
-}
-
-.CodeMirror-gutters {
- position: absolute; left: 0; top: 0;
- padding-bottom: 30px;
- z-index: 3;
-}
-.CodeMirror-gutter {
- white-space: normal;
- height: 100%;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- padding-bottom: 30px;
- margin-bottom: -32px;
- display: inline-block;
- /* Hack to make IE7 behave */
- *zoom:1;
- *display:inline;
-}
-.CodeMirror-gutter-elt {
- position: absolute;
- cursor: default;
- z-index: 4;
-}
-
-.CodeMirror-lines {
- cursor: text;
-}
-.CodeMirror pre {
- /* Reset some styles that the rest of the page might have set */
- -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
- border-width: 0;
- background: transparent;
- font-family: inherit;
- font-size: inherit;
- margin: 0;
- white-space: pre;
- word-wrap: normal;
- line-height: inherit;
- color: inherit;
- z-index: 2;
- position: relative;
- overflow: visible;
-}
-.CodeMirror-wrap pre {
- word-wrap: break-word;
- white-space: pre-wrap;
- word-break: normal;
-}
-.CodeMirror-code pre {
- border-right: 30px solid transparent;
- width: -webkit-fit-content;
- width: -moz-fit-content;
- width: fit-content;
-}
-.CodeMirror-wrap .CodeMirror-code pre {
- border-right: none;
- width: auto;
-}
-.CodeMirror-linebackground {
- position: absolute;
- left: 0; right: 0; top: 0; bottom: 0;
- z-index: 0;
-}
-
-.CodeMirror-linewidget {
- position: relative;
- z-index: 2;
- overflow: auto;
-}
-
-.CodeMirror-widget {}
-
-.CodeMirror-wrap .CodeMirror-scroll {
- overflow-x: hidden;
-}
-
-.CodeMirror-measure {
- position: absolute;
- width: 100%;
- height: 0;
- overflow: hidden;
- visibility: hidden;
-}
-.CodeMirror-measure pre { position: static; }
-
-.CodeMirror div.CodeMirror-cursor {
- position: absolute;
- visibility: hidden;
- border-right: none;
- width: 0;
-}
-.CodeMirror-focused div.CodeMirror-cursor {
- visibility: visible;
-}
-
-.CodeMirror-selected { background: #d9d9d9; }
-.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
-
-.cm-searching {
- background: #ffa;
- background: rgba(255, 255, 0, .4);
-}
-
-/* IE7 hack to prevent it from returning funny offsetTops on the spans */
-.CodeMirror span { *vertical-align: text-bottom; }
-
-@media print {
- /* Hide the cursor when printing */
- .CodeMirror div.CodeMirror-cursor {
- visibility: hidden;
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/cy2neo.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/cy2neo.css b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/cy2neo.css
deleted file mode 100644
index 52070e6..0000000
--- a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/cy2neo.css
+++ /dev/null
@@ -1,21 +0,0 @@
-svg {
- background: #333;
-}
-.CodeMirror, .CodeMirror-scroll {
- height:auto;
-}
-
-#execute {
- font-size:30px;
- position:absolute;
- top: 0.6em;
- right: 10em;
-}
-
-#neo4jUrl {
- position:absolute;
- right: 5px;
- top: 1em;
- z-index: 100;
- width: 20em;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/FontAwesome.otf
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/FontAwesome.otf b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/FontAwesome.otf
deleted file mode 100644
index 3461e3f..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/FontAwesome.otf and /dev/null differ
http://git-wip-us.apache.org/repos/asf/isis/blob/9679840c/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.eot
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.eot b/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.eot
deleted file mode 100644
index 6cfd566..0000000
Binary files a/example/application/neoapp/webapp/src/main/webapp/cy2neo/styles/fonts/fontawesome-webfont.eot and /dev/null differ