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 2011/11/29 09:12:04 UTC
svn commit: r1207780 - in /incubator/isis/trunk/examples/onlinedemo: ./
dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/demo/
dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/
dom/src/main/java/org/apache/isis/examples/onlinede...
Author: danhaywood
Date: Tue Nov 29 08:11:58 2011
New Revision: 1207780
URL: http://svn.apache.org/viewvc?rev=1207780&view=rev
Log:
ISIS-130: enhancements to the onlinedemo functionality
Added:
incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/demo/
incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/demo/DemoFixtures.java
incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/demo/
incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/demo/DemoFixturesDefault.java
incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticationManagerSupportingInMemoryRegistrationInstaller.java
incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticatorInMemory.java
- copied, changed from r1207478, incubator/isis/trunk/framework/security/dflt/src/main/java/org/apache/isis/security/dflt/authentication/inmemory/AuthenticatorInMemory.java
incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/users/
incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/users/auth/
incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/default.css
Removed:
incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/users/
incubator/isis/trunk/examples/onlinedemo/fixture/src/main/java/fixture/
incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/objstore/dflt/
Modified:
incubator/isis/trunk/examples/onlinedemo/ (props changed)
incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Categories.java
incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Category.java
incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItem.java
incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItems.java
incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/CategoriesDefault.java
incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/ToDoItemsDefault.java
incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/isis.properties
incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/web.xml
Propchange: incubator/isis/trunk/examples/onlinedemo/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Tue Nov 29 08:11:58 2011
@@ -1,2 +1,3 @@
.settings
.project
+target
Added: incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/demo/DemoFixtures.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/demo/DemoFixtures.java?rev=1207780&view=auto
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/demo/DemoFixtures.java (added)
+++ incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/demo/DemoFixtures.java Tue Nov 29 08:11:58 2011
@@ -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.examples.onlinedemo.dom.demo;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Idempotent;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Named;
+import org.apache.isis.examples.onlinedemo.dom.items.ToDoItem;
+
+@Named("Demo")
+public interface DemoFixtures {
+
+ @Idempotent
+ @MemberOrder(sequence="1")
+ public List<ToDoItem> resetDemoFixtures();
+
+}
Modified: incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Categories.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Categories.java?rev=1207780&r1=1207779&r2=1207780&view=diff
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Categories.java (original)
+++ incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Categories.java Tue Nov 29 08:11:58 2011
@@ -34,4 +34,6 @@ public interface Categories {
public Category newCategory(
@Named("Description") String description);
+
+ public Category find(String description);
}
Modified: incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Category.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Category.java?rev=1207780&r1=1207779&r2=1207780&view=diff
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Category.java (original)
+++ incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/Category.java Tue Nov 29 08:11:58 2011
@@ -21,20 +21,33 @@ package org.apache.isis.examples.onlined
import org.apache.isis.applib.AbstractDomainObject;
import org.apache.isis.applib.annotation.Bounded;
+import org.apache.isis.applib.annotation.Immutable;
import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Title;
+import org.apache.isis.applib.filter.Filter;
+import com.google.common.base.Objects;
+
+@Immutable
@Bounded
public class Category extends AbstractDomainObject {
- // {{ Title
- public String title() {
- return getDescription();
+ // {{ filters (programmatic)
+ public static Filter<Category> matching(final String description) {
+ return new Filter<Category>() {
+
+ @Override
+ public boolean accept(Category category) {
+ return Objects.equal(category.getDescription(), description);
+ }};
}
// }}
+
// {{ Description
private String description;
+ @Title
@MemberOrder(sequence = "1")
public String getDescription() {
return description;
Modified: incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItem.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItem.java?rev=1207780&r1=1207779&r2=1207780&view=diff
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItem.java (original)
+++ incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItem.java Tue Nov 29 08:11:58 2011
@@ -20,19 +20,73 @@
package org.apache.isis.examples.onlinedemo.dom.items;
import org.apache.isis.applib.annotation.Disabled;
+import org.apache.isis.applib.annotation.Hidden;
import org.apache.isis.applib.annotation.Ignore;
import org.apache.isis.applib.annotation.MemberOrder;
import org.apache.isis.applib.annotation.Named;
import org.apache.isis.applib.annotation.Title;
import org.apache.isis.applib.clock.Clock;
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.applib.util.TitleBuffer;
import org.apache.isis.applib.value.Date;
-public class ToDoItem {
+import com.google.common.base.Objects;
+
+public class ToDoItem implements Comparable<ToDoItem> {
+
+ // {{ filters (programmatic)
+ public static Filter<ToDoItem> thoseDue() {
+ return Filters.and(
+ Filters.not(thoseComplete()),
+ new Filter<ToDoItem>() {
+ @Override
+ public boolean accept(ToDoItem t) {
+ return t.isDue();
+ }
+ });
+ }
+
+ public static Filter<ToDoItem> thoseComplete() {
+ return new Filter<ToDoItem>() {
+ @Override
+ public boolean accept(ToDoItem t) {
+ return t.isComplete();
+ }
+ };
+ }
+
+ public static Filter<ToDoItem> thoseOwnedBy(final String currentUser) {
+ return new Filter<ToDoItem>() {
+ @Override
+ public boolean accept(ToDoItem toDoItem) {
+ return Objects.equal(toDoItem.getUserName(), currentUser);
+ }
+
+ };
+ }
+ // }}
+
+
+ // {{ Identification
+ public String title() {
+ final TitleBuffer buf = new TitleBuffer();
+ buf.append(getDescription());
+ if(isComplete()) {
+ buf.append(" - Completed!");
+ } else {
+ if(getDueBy() != null) {
+ buf.append(" due by ", getDueBy());
+ }
+ }
+ return buf.toString();
+ }
+ // }}
+
// {{ Description
private String description;
- @Title
@MemberOrder(sequence = "1")
public String getDescription() {
return description;
@@ -69,6 +123,19 @@ public class ToDoItem {
}
// }}
+ // {{ UserName (property)
+ private String userName;
+
+ @MemberOrder(sequence = "1")
+ @Hidden
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(final String userName) {
+ this.userName = userName;
+ }
+ // }}
// {{ Complete
@@ -76,7 +143,7 @@ public class ToDoItem {
@Disabled
@MemberOrder(sequence = "3")
- public boolean getComplete() {
+ public boolean isComplete() {
return complete;
}
@@ -87,8 +154,9 @@ public class ToDoItem {
// {{ completed
@MemberOrder(sequence = "1")
- public void completed() {
+ public ToDoItem completed() {
setComplete(true);
+ return this;
}
public String disableCompleted() {
return complete?"Already completed":null;
@@ -97,14 +165,16 @@ public class ToDoItem {
// {{ notYetCompleted
@MemberOrder(sequence = "2")
- public void notYetCompleted() {
+ public ToDoItem notYetCompleted() {
setComplete(false);
+ return this;
}
public String disableNotYetCompleted() {
return !complete?"Not yet completed":null;
}
// }}
+
// {{ clone (action)
@Named("Clone")
@MemberOrder(sequence = "1")
@@ -125,15 +195,45 @@ public class ToDoItem {
}
// }}
+ // {{ compareTo (programmatic)
+ /**
+ * by complete flag, then due by date, then description
+ */
+ @Ignore
+ @Override
+ public int compareTo(ToDoItem other) {
+ if(isComplete() && !other.isComplete()) {
+ return +1;
+ }
+ if(!isComplete() && other.isComplete()) {
+ return -1;
+ }
+ if(getDueBy() == null && other.getDueBy() != null) {
+ return +1;
+ }
+ if(getDueBy() != null && other.getDueBy() == null) {
+ return -1;
+ }
+ if( getDueBy() == null && other.getDueBy() == null ||
+ getDueBy().equals(this.getDescription())) {
+ return getDescription().compareTo(other.getDescription());
+ }
+ return (int) (getDueBy().getMillisSinceEpoch() - other.getDueBy().getMillisSinceEpoch());
+ }
+ // }}
+
// {{ injected: ToDoItems
private ToDoItems toDoItems;
-
public void setToDoItems(final ToDoItems toDoItems) {
this.toDoItems = toDoItems;
}
// }}
+
+
+
+
}
Modified: incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItems.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItems.java?rev=1207780&r1=1207779&r2=1207780&view=diff
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItems.java (original)
+++ incubator/isis/trunk/examples/onlinedemo/dom/src/main/java/org/apache/isis/examples/onlinedemo/dom/items/ToDoItems.java Tue Nov 29 08:11:58 2011
@@ -34,10 +34,19 @@ public interface ToDoItems {
@MemberOrder(sequence="1")
public List<ToDoItem> toDosForToday();
+
@MemberOrder(sequence="2")
public ToDoItem newToDo(
@Named("Description") String description,
Category category,
@Named("Due by") @Optional Date dueBy);
+
+ @QueryOnly
+ @MemberOrder(sequence="3")
+ public List<ToDoItem> allToDos();
+
+ @MemberOrder(sequence="4")
+ public void removeCompleted();
+
}
Added: incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/demo/DemoFixturesDefault.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/demo/DemoFixturesDefault.java?rev=1207780&view=auto
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/demo/DemoFixturesDefault.java (added)
+++ incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/demo/DemoFixturesDefault.java Tue Nov 29 08:11:58 2011
@@ -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.examples.onlinedemo.objstore.dflt.demo;
+
+import java.util.List;
+
+import org.apache.isis.applib.AbstractFactoryAndRepository;
+import org.apache.isis.applib.clock.Clock;
+import org.apache.isis.applib.value.Date;
+import org.apache.isis.examples.onlinedemo.dom.demo.DemoFixtures;
+import org.apache.isis.examples.onlinedemo.dom.items.Categories;
+import org.apache.isis.examples.onlinedemo.dom.items.Category;
+import org.apache.isis.examples.onlinedemo.dom.items.ToDoItem;
+import org.apache.isis.examples.onlinedemo.dom.items.ToDoItems;
+
+public class DemoFixturesDefault extends AbstractFactoryAndRepository implements DemoFixtures {
+
+ // {{ Id, iconName
+ @Override
+ public String getId() {
+ return "fixtures";
+ }
+
+ public String iconName() {
+ return "Fixtures";
+ }
+ // }}
+
+ @Override
+ public List<ToDoItem> resetDemoFixtures() {
+ Category domesticCategory = findOrCreateCategory("Domestic");
+ Category professionalCategory = findOrCreateCategory("Professional");
+
+ removeAllToDosForCurrentUser();
+
+ createToDoItemForCurrentUser("Buy milk", domesticCategory, daysFromToday(0));
+ createToDoItemForCurrentUser("Buy stamps", domesticCategory, daysFromToday(0));
+ createToDoItemForCurrentUser("Pick up laundry", domesticCategory, daysFromToday(6));
+ createToDoItemForCurrentUser("Write blog post", professionalCategory, null);
+ createToDoItemForCurrentUser("Organize brown bag", professionalCategory, daysFromToday(14));
+
+ getContainer().flush();
+
+ return toDoItems.allToDos();
+ }
+
+ // {{ helpers
+ private Category findOrCreateCategory(String description) {
+ Category category = categories.find(description);
+ if(category != null) {
+ return category;
+ }
+ return categories.newCategory(description);
+ }
+
+ private void removeAllToDosForCurrentUser() {
+ final List<ToDoItem> allToDos = toDoItems.allToDos();
+ for (ToDoItem toDoItem : allToDos) {
+ getContainer().remove(toDoItem);
+ }
+ }
+
+ private ToDoItem createToDoItemForCurrentUser(String description, Category category, Date dueBy) {
+ return toDoItems.newToDo(description, category, dueBy);
+ }
+
+ private static Date daysFromToday(int i) {
+ final Date date = new Date(Clock.getTimeAsDateTime());
+ date.add(0, 0, i);
+ return date;
+ }
+ // }}
+
+
+ // {{ injected: Categories
+ private Categories categories;
+
+ public void setCategories(final Categories categories) {
+ this.categories = categories;
+ }
+ // }}
+
+
+ // {{ injected: ToDoItems
+ private ToDoItems toDoItems;
+ public void setToDoItems(ToDoItems toDoItems) {
+ this.toDoItems = toDoItems;
+ }
+ // }}
+
+
+}
Modified: incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/CategoriesDefault.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/CategoriesDefault.java?rev=1207780&r1=1207779&r2=1207780&view=diff
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/CategoriesDefault.java (original)
+++ incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/CategoriesDefault.java Tue Nov 29 08:11:58 2011
@@ -49,10 +49,19 @@ public class CategoriesDefault extends A
@Override
public Category newCategory(String description) {
- final Category category = newTransientInstance(Category.class);
+ Category category = find(description);
+ if(category != null) {
+ return category;
+ }
+ category = newTransientInstance(Category.class);
category.setDescription(description);
persist(category);
return category;
}
+ @Override
+ public Category find(String description) {
+ return firstMatch(Category.class, Category.matching(description));
+ }
+
}
Modified: incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/ToDoItemsDefault.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/ToDoItemsDefault.java?rev=1207780&r1=1207779&r2=1207780&view=diff
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/ToDoItemsDefault.java (original)
+++ incubator/isis/trunk/examples/onlinedemo/objstore-default/src/main/java/org/apache/isis/examples/onlinedemo/objstore/dflt/items/ToDoItemsDefault.java Tue Nov 29 08:11:58 2011
@@ -19,17 +19,17 @@
package org.apache.isis.examples.onlinedemo.objstore.dflt.items;
+import java.util.Collections;
import java.util.List;
-
import org.apache.isis.applib.AbstractFactoryAndRepository;
-import org.apache.isis.applib.clock.Clock;
-import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.filter.Filters;
import org.apache.isis.applib.value.Date;
import org.apache.isis.examples.onlinedemo.dom.items.Category;
import org.apache.isis.examples.onlinedemo.dom.items.ToDoItem;
import org.apache.isis.examples.onlinedemo.dom.items.ToDoItems;
+
public class ToDoItemsDefault extends AbstractFactoryAndRepository implements ToDoItems {
// {{ Id, iconName
@@ -42,30 +42,57 @@ public class ToDoItemsDefault extends Ab
return "ToDoItem";
}
// }}
-
+ // {{ ToDosForToday (action)
@Override
public List<ToDoItem> toDosForToday() {
- return allMatches(ToDoItem.class, new Filter<ToDoItem>() {
- @Override
- public boolean accept(ToDoItem t) {
- return !t.getComplete() && t.isDue();
- }
- });
+ return allMatches(ToDoItem.class, Filters.and(ToDoItem.thoseOwnedBy(currentUser()), ToDoItem.thoseDue()));
}
-
+ // }}
- // {{ NewToDo
+ // {{ NewToDo (action)
@Override
public ToDoItem newToDo(String description, Category category, Date dueBy) {
ToDoItem toDoItem = newTransientInstance(ToDoItem.class);
toDoItem.setDescription(description);
toDoItem.setCategory(category);
toDoItem.setDueBy(dueBy);
+ toDoItem.setUserName(currentUser());
persist(toDoItem);
return toDoItem;
}
// }}
+ // {{ AllToDos (action)
+ @Override
+ public List<ToDoItem> allToDos() {
+ final String currentUser = currentUser();
+ final List<ToDoItem> items = allMatches(ToDoItem.class, ToDoItem.thoseOwnedBy(currentUser));
+ Collections.sort(items);
+ return items;
+ }
+ // }}
+
+ // {{ AllToDos (action)
+
+ @Override
+ public void removeCompleted() {
+ final List<ToDoItem> complete= allMatches(ToDoItem.class, ToDoItem.thoseComplete());
+ for (ToDoItem toDoItem : complete) {
+ getContainer().remove(toDoItem);
+ }
+ final int size = complete.size();
+ getContainer().informUser("" + size + " item" +
+ (size != 1? "s": "") +
+ " removed");
+ }
+ // }}
+
+ // {{ helpers
+ private String currentUser() {
+ return getContainer().getUser().getName();
+ }
+ // }}
+
}
Added: incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticationManagerSupportingInMemoryRegistrationInstaller.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticationManagerSupportingInMemoryRegistrationInstaller.java?rev=1207780&view=auto
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticationManagerSupportingInMemoryRegistrationInstaller.java (added)
+++ incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticationManagerSupportingInMemoryRegistrationInstaller.java Tue Nov 29 08:11:58 2011
@@ -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.examples.onlinedemo.auth;
+
+import java.util.List;
+
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.runtime.authentication.standard.Authenticator;
+import org.apache.isis.runtimes.dflt.runtime.authentication.AuthenticationManagerStandardInstallerAbstractForDfltRuntime;
+import org.apache.isis.security.file.authentication.FileAuthenticator;
+
+import com.google.common.collect.Lists;
+
+public class AuthenticationManagerSupportingInMemoryRegistrationInstaller extends
+ AuthenticationManagerStandardInstallerAbstractForDfltRuntime {
+
+ public AuthenticationManagerSupportingInMemoryRegistrationInstaller() {
+ super("demo");
+ }
+
+ @Override
+ protected List<Authenticator> createAuthenticators(IsisConfiguration configuration) {
+ return Lists.<Authenticator>newArrayList(new FileAuthenticator(configuration), new AuthenticatorInMemory(configuration));
+ }
+
+}
Copied: incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticatorInMemory.java (from r1207478, incubator/isis/trunk/framework/security/dflt/src/main/java/org/apache/isis/security/dflt/authentication/inmemory/AuthenticatorInMemory.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticatorInMemory.java?p2=incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticatorInMemory.java&p1=incubator/isis/trunk/framework/security/dflt/src/main/java/org/apache/isis/security/dflt/authentication/inmemory/AuthenticatorInMemory.java&r1=1207478&r2=1207780&rev=1207780&view=diff
==============================================================================
--- incubator/isis/trunk/framework/security/dflt/src/main/java/org/apache/isis/security/dflt/authentication/inmemory/AuthenticatorInMemory.java (original)
+++ incubator/isis/trunk/examples/onlinedemo/webapp/src/main/java/org/apache/isis/examples/onlinedemo/auth/AuthenticatorInMemory.java Tue Nov 29 08:11:58 2011
@@ -17,11 +17,10 @@
* under the License.
*/
-package org.apache.isis.security.dflt.authentication.inmemory;
+package org.apache.isis.examples.onlinedemo.auth;
import java.util.Map;
-import org.apache.isis.core.commons.components.Noop;
import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.runtime.authentication.AuthenticationRequest;
import org.apache.isis.core.runtime.authentication.AuthenticationRequestPassword;
@@ -34,41 +33,50 @@ import com.google.common.base.Objects;
import com.google.common.collect.Maps;
public class AuthenticatorInMemory extends AuthenticatorAbstract implements Registrar {
-
- private Map<String,String> users = Maps.newHashMap();
+ private static AuthenticatorInMemory instance;
+ /**
+ * Rather nasty, but is required to make available to the Users repository.
+ */
+ public static AuthenticatorInMemory getInstance() {
+ return instance;
+ }
+
+ private Map<String, String> passwordsByUser = Maps.newHashMap();
+
public AuthenticatorInMemory(final IsisConfiguration configuration) {
super(configuration);
+ instance = this;
}
@Override
- public boolean canAuthenticate(final AuthenticationRequest request) {
- return request instanceof AuthenticationRequestPassword;
+ public final boolean canAuthenticate(final Class<? extends AuthenticationRequest> authenticationRequestClass) {
+ return AuthenticationRequestPassword.class.isAssignableFrom(authenticationRequestClass);
}
@Override
- public boolean isValid(final AuthenticationRequest request) {
- final AuthenticationRequestPassword requestPassword = (AuthenticationRequestPassword) request;
- final String password = users.get(requestPassword.getName());
- return Objects.equal(requestPassword.getPassword(), password);
+ public boolean isValid(final AuthenticationRequest authRequest) {
+ final AuthenticationRequestPassword request = (AuthenticationRequestPassword) authRequest;
+ final String userId = request.getName();
+ return Objects.equal(request.getPassword(), passwordsByUser.get(userId));
}
@Override
- public boolean canRegister(final RegistrationDetails registrationDetails) {
- return registrationDetails instanceof RegistrationDetailsPassword;
+ public boolean canRegister(final Class<? extends RegistrationDetails> registrationDetailsClass) {
+ return RegistrationDetailsPassword.class.isAssignableFrom(registrationDetailsClass);
}
@Override
public boolean register(final RegistrationDetails registrationDetails) {
final RegistrationDetailsPassword registration = (RegistrationDetailsPassword) registrationDetails;
- final String user = registration.getUser();
- final String existingPassword = users.get(user);
- if(existingPassword != null) {
+ final String userId = registration.getUser();
+ if(passwordsByUser.containsKey(userId)) {
return false;
}
- final String password = registration.getPassword();
- users.put(user, password);
+ passwordsByUser.put(userId, registration.getPassword());
return true;
}
+
}
+
Modified: incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/isis.properties
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/isis.properties?rev=1207780&r1=1207779&r2=1207780&view=diff
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/isis.properties (original)
+++ incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/isis.properties Tue Nov 29 08:11:58 2011
@@ -14,14 +14,14 @@
# 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.examples.onlinedemo.objstore.dflt
-isis.services = items.ToDoItemsDefault, items.CategoriesDefault
+isis.services.prefix = org.apache.isis.examples.onlinedemo
+isis.services = objstore.dflt.items.ToDoItemsDefault, objstore.dflt.items.CategoriesDefault, objstore.dflt.demo.DemoFixturesDefault
-isis.fixtures.prefix= org.apache.isis.examples.onlinedemo.fixture
-//isis.fixtures= LogonAsSvenFixture,todo.ToDoItemsFixture
-isis.fixtures= items.ToDoItemsFixture
+isis.fixtures.prefix= org.apache.isis.examples.onlinedemo
+//isis.fixtures= fixture.LogonAsSvenFixture,fixture.items.ToDoItemsFixture
-isis.exploration.users=sven, dick, bob
+
+#isis.exploration.users=sven, dick, bob
isis.reflector.class-substitutor=org.apache.isis.runtimes.dflt.bytecode.dflt.classsubstitutor.CglibClassSubstitutor
@@ -34,7 +34,6 @@ isis.persistor.object-factory=org.apache
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.authentication=org.apache.isis.examples.onlinedemo.auth.AuthenticationManagerSupportingInMemoryRegistrationInstaller
Modified: incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/web.xml?rev=1207780&r1=1207779&r2=1207780&view=diff
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/web.xml (original)
+++ incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/WEB-INF/web.xml Tue Nov 29 08:11:58 2011
@@ -78,12 +78,10 @@
<filter>
<filter-name>IsisSessionFilterForHtml</filter-name>
<filter-class>org.apache.isis.runtimes.dflt.webapp.IsisSessionFilter</filter-class>
- <!--
<init-param>
- <param-name>logonPage</param-name>
+ <param-name>redirectToOnNoSessionException</param-name>
<param-value>/logon.htmlviewer</param-value>
</init-param>
- -->
<init-param>
<param-name>cacheAuthSessionOnHttpSession</param-name>
<param-value>true</param-value>
@@ -214,4 +212,5 @@
<url-pattern>*.html</url-pattern>
</servlet-mapping>
+
</web-app>
Added: incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/default.css
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/default.css?rev=1207780&view=auto
==============================================================================
--- incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/default.css (added)
+++ incubator/isis/trunk/examples/onlinedemo/webapp/src/main/webapp/default.css Tue Nov 29 08:11:58 2011
@@ -0,0 +1,939 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/* Start Global styles */
+
+body {
+ background: #101254;
+ text-align: center;
+}
+#wrapper {
+ width: 980px;
+ min-height: 800px;
+ border:3px solid #7F81C0;
+ margin:8px auto;
+ text-align: left;
+ background: white;
+}
+
+.header-icon > img {
+ max-width: 40px;
+ height: 40px;
+}
+
+BODY {
+ font-family: Arial, Sans-Serif;
+ margin: 0 0 10px 0;
+ color: black;
+
+/*
+ background: url(default-images/poweredby-logo.png);
+ background-repeat: no-repeat;
+ background-position: 95% 95%;
+*/
+}
+
+IMG {
+ border: 0;
+}
+
+A {
+ text-decoration: none;
+}
+
+A:hover {
+ text-decoration: underline;
+}
+
+/* End Global styles */ /* Start Heading */
+
+div#site-header:after {
+ bottom: 0px;
+ display: block;
+ text-align: right;
+ float:right;
+ bottom: 0;
+ font-size: 70%;
+ color: gray;
+}
+
+div#site-header {
+ background: url(images/banner-bg.png);
+ background-repeat: repeat-x white-space : nowrap;
+ list-style: none;
+ margin: 0px;
+ height: 100px;
+}
+
+div#site-logo {
+ background: url(images/banner.png);
+ background-repeat: no-repeat;
+ background-position: left;
+ position: absolute;
+ width: 980px;
+ height: 100px;
+ margin: 0 auto;
+}
+
+div#page-header {
+ display: none;
+}
+
+/* END Heading */
+DIV#body {
+ display: block;
+ padding-bottom: 10px;
+}
+
+div#navigation {
+ margin: 0;
+ padding: 0px;
+}
+
+/* Start options*/
+DIV.options {
+ background-color: #eeeeee;
+ margin: 0;
+ padding: 4px 0px 4px 5px;
+ min-height: 20px;
+ align: right;
+ float:right;
+}
+
+
+DIV.options H4 {
+ display: none;
+}
+
+DIV.options DIV.item {
+ display: inline;
+ border-right: 1px solid #000000;
+ font-family: arial, 'sans serif';
+ font-weight: bold;
+ color: #00000;
+ font-size: 70%;
+ margin: 0 6px 0 6px;
+ padding 0 0 0 0;
+ min-width: 200px;
+}
+
+DIV.options DIV.item IMG {
+ display: none;
+}
+
+DIV.options DIV.item a:link {
+ color: #000000;
+ text-decoration: none;
+ margin: 0 5px 0 0px;
+ padding: 0 2px 0 0px;
+}
+
+DIV.options DIV.item a:hover {
+ background-color: #dddddd;
+ margin: 0 5px 0 0px;
+ padding: 0 2px 0 0px;
+}
+
+DIV.options DIV.item a:visited {
+ color: #000000;
+ text-decoration: none;
+ margin: 0 5px 0 0px;
+ padding: 0 2px 0 0px;
+}
+
+/* End options */
+
+/* Start services */
+DIV.services {
+ background-color: #7F81C0;
+ margin: 0;
+ padding: 4px 20px 4px 5px;
+ min-height: 20px;
+
+}
+
+DIV.services H4 {
+ display: none;
+}
+
+DIV.services DIV.item {
+ display: inline;
+ border-right: 1px solid #ffffff;
+ font-family: arial, 'sans serif';
+ font-weight: bold;
+ color: #ffffff;
+ font-size: 70%;
+ margin: 3px;
+}
+
+DIV.services DIV.item IMG {
+ display: none;
+}
+
+DIV.services DIV.item a:link {
+ color: #ffffff;
+ text-decoration: none;
+ margin: 0 5px 0 5px;
+ padding: 0 2px 0 0px;
+}
+
+DIV.services DIV.item a:hover {
+ background-color: #2683E2;
+ margin: 0 5px 0 5px;
+ padding: 0 2px 0 0px;
+}
+
+DIV.services DIV.item a:visited {
+ color: #ffffff;
+ text-decoration: none;
+ margin: 0 5px 0 5px;
+ padding: 0 2px 0 0px;
+}
+
+DIV.services DIV.item-selected {
+ background-color: #2683E2;
+ display: inline;
+ border-right: 1px solid #ffffff;
+ font-family: arial, 'sans serif';
+ font-weight: bold;
+ color: #ffffff;
+ font-size: 70%;
+}
+
+DIV.services DIV.item-selected a:link {
+ color: #ffffff;
+ text-decoration: none;
+ margin: 0 5px 0 5px;
+ padding: 0 2px 0 0px;
+}
+
+DIV.services DIV.item-selected a:hover {
+ background-color: #556677;
+ margin: 0 5px 0 5px;
+ padding: 0 2px 0 0px;
+}
+
+DIV.services DIV.item-selected a:visited {
+ color: #ffffff;
+ text-decoration: none;
+ margin: 0 5px 0 5px;
+ padding: 0 2px 0 0px;
+}
+
+/* End services */ /* Start History */
+DIV.history {
+ background-color: #D6D6D6;
+ margin: 0;
+ padding: 1px 30px 0 5px;
+ min-height: 26px;
+}
+
+DIV.history H4 {
+ display: none;
+}
+
+DIV.history DIV.item {
+ display: inline;
+ border-right: 1px solid #ffffff;
+ font-family: arial, 'sans serif';
+ font-weight: bold;
+ color: #29357D;
+ font-size: 70%;
+}
+
+DIV.history DIV.item IMG {
+ position: relative;
+ top: 4px;
+ height: 16px;
+ padding: 0 5px 0 0px;
+}
+
+DIV.history DIV.item a:link {
+ color: #29357D;
+ text-decoration: none;
+ margin: 5px;
+ padding: 1px 3px 1px 3px;
+}
+
+DIV.history DIV.item a:hover {
+ background-color: #B7B6B6;
+ padding: 1px 3px 1px 3px;
+}
+
+DIV.history DIV.item a:visited {
+ color: #29357D;
+ text-decoration: none;
+ padding: 1px 3px 1px 3px;
+}
+
+DIV.history DIV.item-selected {
+ background-color: #2683E2;
+ display: inline;
+ border-right: 1px solid #ffffff;
+ font-family: arial, 'sans serif';
+ font-weight: bold;
+ color: #29357D;
+ font-size: 70%;
+ height: 30px;
+}
+
+DIV.history DIV.item-selected a:hover {
+ background-color: #556677;
+ padding: 1px 3px 1px 3px;
+}
+
+DIV.history DIV.item-selected a:link {
+ color: #29357D;
+ text-decoration: none;
+ margin: 10px;
+ padding: 1px 3px 1px 3px;
+}
+
+DIV.history DIV.item-selected a:visited {
+ color: #29357D;
+ text-decoration: none;
+ padding: 1px 3px 1px 3px;
+}
+
+/* INVISIBLE character for empty item. FIREFOX ONLY*/
+DIV.history:after {
+ content: "X";
+ display: inline;
+ text-align: right;
+ font-size: 70%;
+ color: #D6D6D6;
+}
+
+/* End History */ /* Start Context */
+div#context {
+ background-color: #F0F0F0;
+ margin: 0;
+ padding: 1px 30px 0 7px;
+ min-height: 26px;
+}
+
+div#context span.disabled {
+ display: inline;
+ font-family: arial, 'sans serif';
+ font-weight: normal;
+ color: #666666;
+ font-size: 70%;
+ padding: 0px 5px 0px 7px;
+ white-space: nowrap;
+}
+
+div#context span.disabled IMG {
+ display: none
+}
+
+div#context span.disabled a:link {
+ color: #29357D;
+ text-decoration: none;
+ margin: 5px;
+ padding: 1px 3px 1px 3px;
+}
+
+div#context span.disabled a:hover {
+ background-color: #B7B6B6;
+ padding: 1px 3px 1px 3px;
+}
+
+div#context span.disabled a:visited {
+ color: #29357D;
+ text-decoration: none;
+ padding: 1px 3px 1px 3px;
+}
+
+div#context a.linked {
+ display: inline;
+ font-family: arial, 'sans serif';
+ font-weight: normal;
+ color: #29357D;
+ font-size: 70%;
+ padding: 0px 5px 0px 7px;
+}
+
+div#context a.linked IMG {
+ display: none
+}
+
+div#context a.linked a:link {
+ color: #29357D;
+ text-decoration: none;
+ margin: 5px;
+ padding: 1px 3px 1px 3px;
+}
+
+div#context a.linked a:hover {
+ background-color: #29357D;
+ padding: 1px 3px 1px 3px;
+ text-decoration: underline;
+}
+
+div#context a.linked a:visited {
+ color: #29357D;
+ text-decoration: none;
+ padding: 1px 3px 1px 3px;
+}
+
+/* INVISIBLE character for empty breadcrumbs. FIREFOX ONLY*/
+span.disabled:after {
+ content: "X";
+ display: inline;
+ text-align: right;
+ font-size: 70%;
+ color: #F0F0F0;
+}
+
+/* End Context */ /*
+div#help-bar {
+ position: relative;
+ right: 50px;
+ top: 10px;
+ text-align: right;
+ font-family : arial, 'sans serif';
+ font-weight : normal;
+ color: #0000FF;
+ font-size : 90%;
+ line-height : 110%;
+ text-decoration: underline;
+ height: 22px;
+}
+*/
+DIV#body DIV#view {
+ position: relative;
+ top: 0px;
+ left: 0px;
+ margin: 0px;
+}
+
+/* Start of Message Header */
+DIV.message-header {
+ position: relative;
+ top: 40px;
+ padding: 5px 25px 5px 25px;
+ margin: 0 50px 0 255px;
+ vertical-align: middle;
+ COLOR: #003366;
+ FONT-WEIGHT: bold;
+ FONT-SIZE: 80%;
+ LEFT: auto;
+ FONT-STYLE: normal;
+ FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif;
+ width: 40%;
+}
+
+DIV.message-header DIV.warning {
+ COLOR: #ff0033;
+ padding: 5px 25px 5px 25px;
+ background: url(default-images/sign-warning.png);
+ background-repeat: no-repeat;
+ background-color: #D6D6D6;
+ background-position: 5px 5px;
+}
+
+DIV.message-header DIV.message {
+ COLOR: #003366;
+ padding: 5px 25px 5px 25px;
+ background: url(default-images/sign-info.png);
+ background-repeat: no-repeat;
+ background-color: #D6D6D6;
+ background-position: 5px 5px;
+}
+
+DIV.message-header DIV.message {
+ FONT-WEIGHT: normal;
+}
+
+/* End of Message Header */ /* Start of Object Header */
+DIV.header {
+ position: relative;
+ top: 40px;
+ display: block;
+ background-color: #F0F0F0;
+ min-height: 48px;
+ margin: 0 50px 0 280px;
+
+}
+
+SPAN.header-icon IMG {
+ float: left;
+}
+
+SPAN.header-text {
+ float: left;
+ position: relative;
+ top: 10px;
+ margin-left: 7px;
+ FONT-WEIGHT: bold;
+ FONT-SIZE: 16px;
+ LEFT: auto;
+ COLOR: #003366;
+ FONT-STYLE: normal;
+ FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif;
+}
+
+/* End of Object Header */ /* Start of Object Contents */
+DIV#content {
+ position: relative;
+ display: block;
+ top: 40px;
+ margin: 0 50px 10px 280px;
+}
+
+/* Start of Object Fields */
+DIV.field {
+ margin: 0;
+ padding: 5px 0px 5px 0px;
+ border-top: 1px solid #666666;
+ min-height: 20px;
+}
+
+DIV.field SPAN.value IMG,DIV.field DIV.value IMG {
+ position: relative;
+ top: 3px;
+ margin: 0px 5px 0 0;
+ height: 16px;
+}
+
+DIV.field SPAN.value A,DIV.field DIV.value A {
+ position: relative;
+ top: -2px;
+ margin: 0px 5px 0 0;
+ height: 16px;
+}
+
+DIV.field DIV.icon IMG {
+ position: relative;
+ top: 0px;
+ margin: 0px 5px 0 0;
+ height: 16px;
+}
+
+.label,.value {
+ font-size: 80%;
+ color: #333399;
+}
+
+DIV.field DIV.icon {
+ display: inline;
+ color: #333399;
+ position: absolute;
+ left: 200px;
+}
+
+DIV.field span.label,DIV.field DIV.label {
+ width: 170px;
+ display: block;
+ /*content: ":";*/
+ margin: 0 0 -18px 7px;
+}
+
+DIV.field span.separator {
+ display: inline;
+ position: relative;
+ margin: 0 0 -15px 180px;
+ vertical-align: top;
+}
+
+DIV.field span.value, DIV.field DIV.value, DIV.field INPUT.value, DIV.field SELECT.value
+ {
+ top: -2px;
+ position: relative;
+ margin: 0px 10px -5px 0px;
+ display: inline;
+}
+
+DIV.field span.value PRE {
+ color: #333399;
+ margin: 0;
+ font-family: inherit;
+}
+
+
+DIV.field textarea.value {
+ font-family: inherit;
+}
+
+
+DIV.field span.optional {
+ margin: -35px 0 0 0;
+ font-size: 70%;
+ color: grey;
+}
+
+DIV.field span.required {
+ display: inline;
+ position: relative;
+ margin: 0;
+ vertical-align: top;
+ color: red;
+}
+
+DIV.field span.error {
+ display: inline;
+ position: relative;
+ color: red;
+ font-size: 70%;
+}
+
+/* INVISIBLE character for empty value FIREFOX ONLY*/
+DIV.field span.value:after {
+ content: "X";
+ display: inline;
+ text-align: right;
+ font-size: 70%;
+ color: white;
+}
+
+/* INVISIBLE character for empty value FIREFOX ONLY*/
+DIV.field span.label:after {
+ content: "X";
+ display: inline;
+ text-align: right;
+ font-size: 70%;
+ color: white;
+}
+
+/* End of Object Fields */ /* Start of Object Table */
+DIV#content TABLE {
+ position: relative;
+ float: left;
+ width: 100%;
+ border: 0;
+ margin: 0 0 10px 0;
+ border-collapse: collapse;
+}
+
+DIV#content TH {
+ padding: 6px;
+ border: 1px solid #ffffff;
+ background-color: #D6D6D6;
+ font-family: arial, 'sans serif';
+ font-weight: bold;
+ color: black;
+ font-size: 70%;
+}
+
+DIV#content TD {
+ background-color: #ffffff;
+ border-right: 0;
+ border-left: 0;
+ border-bottom: 1px solid black;
+ padding: 6px;
+ font-family: arial, 'sans serif';
+ font-weight: normal;
+ font-size: 80%;
+ color: #333399;
+ margin: 0;
+ text-align: left;
+}
+
+DIV#content TD.rowstart {
+ background-color: #F0F0F0;
+}
+
+DIV#content TD A:visited {
+ color: #0000FF;
+}
+
+DIV#content H4 {
+ font-family: arial, 'sans serif';
+ font-weight: normal;
+ color: #000000;
+ font-size: 70%;
+ border-top: 1px solid black;
+ margin: -2px 0 0 0px;
+ padding: 5px;
+}
+
+TD DIV.icon {
+ font-size: 100%;
+ margin-top: 5px;
+}
+
+TD DIV.icon IMG {
+ float: left;
+ margin: -1px 5px 5px 0px;
+ height: 16px;
+}
+
+TD DIV.action-button {
+ background-color: #ffffff;
+ font-size: 130%;
+ text-decoration: none;
+}
+
+/* End of Object Table */
+INPUT.action-button,DIV.action-button {
+ background-color: #F0F0F0;
+ padding: 10px;
+ display: block;
+ margin: 0;
+ min-height: 20px;
+}
+
+INPUT.action-button,DIV.action-button A {
+ background: url(default-images/bg-button.gif);
+ background-repeat: repeat-x;
+ padding: 2px;
+ margin: 5px;
+ border: 1px solid #333399;
+ font-family: arial, 'sans serif';
+ font-weight: normal;
+ color: #000000;
+ font-size: 70%;
+ font-weight: normal;
+ text-align: center;
+}
+
+DIV.action-button a:link {
+ color: #000000;
+}
+
+DIV.action-button a:visited {
+ color: #000000;
+}
+
+DIV.action-button a:hover {
+ color: #000000;
+ text-decoration: none;
+}
+
+INPUT.action-button,DIV.action-button INPUT {
+ float: left;
+}
+
+/* End of Object Contents */ /* Start of Object Actions Menu */
+DIV#body DIV#view DIV#menu {
+ position: relative;
+ top: 40px;
+ left: 0;
+ background-color: #ffffff;
+ border-top: 1px solid #00336F;
+ margin: 0px;
+ width: 210px;
+ display: block;
+ float: left;
+}
+
+DIV#body DIV#menu H3 {
+ display: none;
+}
+
+DIV#menu SPAN.name {
+ display: block;
+ font-size: 80%;
+ background-color: #ffffff;
+ color: #333399;
+ line-height: 100%;
+ margin: 0 0 0 10px;
+}
+
+DIV.menu-item a:link {
+ color: #333399;
+}
+
+DIV.menu-item a:visited {
+ color: #333399;
+}
+
+DIV.submenu-item {
+ font-size: 80%;
+ background-color: #ffffff;
+ color: #1A59A7;
+ margin: 0px;
+ padding: 5px 0px 5px 10px;
+ border-bottom: 1px solid #00336F;
+ line-height: 100%;
+}
+
+DIV.submenu-item DIV.menu-item {
+ background: url(default-images/submenu-bullet.gif);
+ background-repeat: no-repeat;
+ background-position: left;
+ background-color: #ffffff;
+ margin: 0px;
+ line-height: 100%;
+ border: 0;
+ padding: 4px 5px 0px 10px;
+ font-family: arial, 'sans serif';
+ font-weight: normal;
+ color: #1A59A7;
+ font-size: 85%;
+}
+
+DIV.menu-item {
+ background-color: #ffffff;
+ margin: 0px;
+ line-height: 110%;
+ border-bottom: 1px solid #00336F;
+ padding: 5px 5px 5px 10px;
+ font-family: arial, 'sans serif';
+ font-weight: normal;
+ color: #1A59A7;
+ font-size: 80%;
+}
+
+DIV.menu-item DIV.disabled {
+ color: #a0a0a0;
+}
+
+DIV.menu-item a:link {
+ color: #1A59A7;
+}
+
+DIV.menu-item a:visited {
+ color: #1A59A7;
+}
+
+DIV.menu-item a:hover {
+ color: #006666;
+ text-decoration: underline;
+}
+
+DIV.submenu-item DIV.menu-item a:link {
+ color: #1A59A7;
+}
+
+DIV.submenu-item DIV.menu-item a:visited {
+ color: #1A59A7;
+}
+
+DIV.submenu-item DIV.menu-item a:hover {
+ color: #006666;
+ text-decoration: underline;
+}
+
+/* End of Object Menu */
+DIV.page-footer {
+ position: absolute;
+ right: 10px;
+ bottom: 10px;
+ font-size: 50%;
+ color: #333399;
+}
+
+H1 {
+ font-size: 140%;
+ margin-top: -8px;
+}
+
+H2 {
+ font-size: 90%;
+ color: #333399;
+ letter-spacing: 1pt;
+ text-indent:-1pt;
+ margin: 0;
+}
+
+H3 {
+ font-size: 80%;
+ color: #ffffff;
+ letter-spacing: 1pt;
+ text-indent:-1pt;
+ margin: 15px 10px 5px 10px;
+}
+
+H4 {
+ font-size: 80%;
+ color: #333399;
+ letter-spacing: 1pt;
+ text-indent:-1pt;
+ margin: 10px 10px 0px 10px;
+}
+
+DIV.text {
+ font-size: 100%;
+ color: #336699;
+ letter-spacing: 1pt;
+ text-indent:-1pt;
+ margin: 10px 10px 0px 10px;
+}
+
+DIV.error {
+ font-size: 120%;
+ color: #cc0000;
+ letter-spacing: 1pt;
+ text-indent:-1pt;
+ margin: 10px 10px 0px 10px;
+}
+
+PRE.error-trace {
+ font-size: 80%;
+ color: #cc0000;
+ margin: 10px 10px 0px 10px;
+}
+
+DIV#debug { /* float: left;*/
+ background-color: #F0F0F0;
+ margin: 30px;
+ padding: 1px 10px 0 7px;
+ min-height: 22px;
+ border: 1px;
+}
+
+DIV#debug H4 {
+ display: inline;
+ font-size: 80%;
+ color: #999;
+ margin: 0 5px 0 10px;
+}
+
+DIV#debug DIV.detail {
+ display: inline;
+ font-size: 80%;
+ color: #999;
+ margin: 0 5px 0 10px;
+}
+
+DIV#page-footer {
+ display: none;
+}
+
+SPAN.message {
+ position: relative;
+ top: 30px;
+ font-size: 100%;
+ color: #336699;
+ margin: 40px 0 0 0;
+ padding: 10px;
+}
+/* Think this is now redundant
+DIV.items {
+ position: relative;
+}
+*/
+
+
+SPAN.about {
+ display: block;
+ padding: 4px;
+}
+
+
+SPAN.user {
+ display: block;
+ padding: 4px;
+}
+
+.nav-link {
+ display: block;
+ padding: 10px;
+ font-size: 75%;
+}
\ No newline at end of file