RelationAttribute

Auf der Webseite sollten jetzt für alle RelationAttribute statt des keys der lokalisierte Wert angezeigt. Dazu waren u.A. einige Änderungen am ContentItemXMLRenderer und dem RelationAttributeInterface nötig.

git-svn-id: https://svn.libreccm.org/ccm/trunk@686 8810af33-2d31-482b-a856-94f89814c4df
master
quasi 2011-01-16 12:17:03 +00:00
parent 0ae4b22d5f
commit bed3eec727
9 changed files with 254 additions and 33 deletions

View File

@ -25,7 +25,7 @@ object type RelationAttribute {
BigDecimal[1..1] id = cms_relation_attribute.object_id INTEGER;
String[1..1] attribute = cms_relation_attribute.attribute VARCHAR(100);
String[1..1] attr_key = cms_relation_attribute.attr_key VARCHAR(100);
String[1..1] attr_key = cms_relation_attribute.attr_key VARCHAR(100);
String[1..1] lang = cms_relation_attribute.lang VARCHAR(2);
String[1..1] name = cms_relation_attribute.name VARCHAR(100);
String[0..1] description = cms_relation_attribute.description VARCHAR(500);

View File

@ -55,7 +55,6 @@ import com.arsdigita.util.Reporter;
import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.versioning.VersionedACSObject;
import com.arsdigita.versioning.Versions;
import java.util.logging.Level;
import org.apache.log4j.Logger;
import java.math.BigDecimal;
@ -68,7 +67,6 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
/**
* This class represents a content item.
@ -202,7 +200,7 @@ import java.util.StringTokenizer;
*
* @version $Id: ContentItem.java 1621 2007-09-13 12:43:12Z chrisg23 $
*/
public class ContentItem extends VersionedACSObject implements CustomCopy, RelationAttributeInterface {
public class ContentItem extends VersionedACSObject implements CustomCopy {
private static final Logger s_log = Logger.getLogger(ContentItem.class);
private static final Logger s_logDenorm = Logger.getLogger(ContentItem.class.getName() + ".Denorm");
@ -235,7 +233,6 @@ public class ContentItem extends VersionedACSObject implements CustomCopy, Relat
public static final String DRAFT_VERSION = "masterVersion";
public static final String VERSIONS = "slaveVersions";
public static final String CONTENT_SECTION = "section";
private static final String RELATION_ATTRIBUTES = "";
private static final String PUBLISH_LISTENER_CLASS =
PublishLifecycleListener.class.getName();
private VersionCache m_pending;
@ -2083,11 +2080,4 @@ public class ContentItem extends VersionedACSObject implements CustomCopy, Relat
return extraXMLGenerators;
}
public boolean hasRelationAttributes() {
return !RELATION_ATTRIBUTES.isEmpty();
}
public StringTokenizer getRelationAttributes() {
return new StringTokenizer(RELATION_ATTRIBUTES, ";");
}
}

View File

@ -26,6 +26,10 @@ import com.arsdigita.xml.Element;
*/
public class ContentItemXMLRenderer extends DomainObjectXMLRenderer {
private String m_propertyName = "";
private String m_keyName = "";
private String m_relationAttribute = "";
public ContentItemXMLRenderer(Element root) {
super(root);
}
@ -56,10 +60,11 @@ public class ContentItemXMLRenderer extends DomainObjectXMLRenderer {
String path,
Property property) {
String name = property.getName();
String propertyName = property.getName();
// Special handling for the isoCountryCode field in GenericAddress
if (obj instanceof GenericAddress) {
if (name.equals("isoCountryCode")) {
if (propertyName.equals("isoCountryCode")) {
super.handleAttribute(obj, path, property);
Element element = newElement(m_element, "country");
@ -68,6 +73,66 @@ public class ContentItemXMLRenderer extends DomainObjectXMLRenderer {
}
}
// Special handling for the relation attribute keys
if (!m_relationAttribute.isEmpty()) {
String key = "";
// The RelationAttribute is part of this domain object as field
if (obj instanceof RelationAttributeInterface
&& ((RelationAttributeInterface) obj).hasRelationAttributeProperty(propertyName)) {
RelationAttributeInterface relationAttributeObject = (RelationAttributeInterface) obj;
key = relationAttributeObject.getRelationAttributeKey(propertyName);
}
// This RelationAttribute is part of an n:m association as link attribute
if (obj instanceof LinkDomainObject
&& propertyName.equals(m_keyName)) {
key = (String) ((LinkDomainObject) obj).get(m_keyName);
}
// Replace value of the property defined in RELATION_ATTRIBUTES string
// of the primary domain object with the localized String.
if (!key.isEmpty()) {
RelationAttributeCollection relationAttributeCollection = new RelationAttributeCollection(m_relationAttribute, key);
relationAttributeCollection.addLanguageFilter(DispatcherHelper.getNegotiatedLocale().getLanguage());
Element element = newElement(m_element, m_keyName);
element.setText(relationAttributeCollection.getName());
relationAttributeCollection.close();
return;
}
}
super.handleAttribute(obj, path, property);
}
@Override
protected void beginAssociation(DomainObject obj, String path, Property property) {
super.beginAssociation(obj, path, property);
String propertyName = property.getName();
if (obj instanceof RelationAttributeInterface
&& ((RelationAttributeInterface) obj).hasRelationAttributeProperty(propertyName)) {
RelationAttributeInterface relationAttributeObject = (RelationAttributeInterface) obj;
m_propertyName = propertyName;
m_keyName = relationAttributeObject.getRelationAttributeKeyName(propertyName);
m_relationAttribute = relationAttributeObject.getRelationAttributeName(propertyName);
}
}
@Override
protected void endAssociation(DomainObject obj, String path, Property property) {
m_propertyName = "";
m_keyName = "";
m_relationAttribute = "";
super.endAssociation(obj, path, property);
}
}

View File

@ -101,10 +101,16 @@ public class RelationAttributeCollection extends DomainCollection {
// Accessors
public final String getKey() {
if (this.isBeforeFirst()) {
this.next();
}
return (String) get(KEY);
}
public final String getLanguage() {
if (this.isBeforeFirst()) {
this.next();
}
return (String) get(LANGUAGE);
}
@ -133,10 +139,16 @@ public class RelationAttributeCollection extends DomainCollection {
}
public String getName() {
if (this.isBeforeFirst()) {
this.next();
}
return getRelationAttribute().getName();
}
public String getDescription() {
if (this.isBeforeFirst()) {
this.next();
}
return getRelationAttribute().getDescription();
}

View File

@ -2,7 +2,6 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.arsdigita.cms;
import java.util.StringTokenizer;
@ -15,6 +14,13 @@ public interface RelationAttributeInterface {
public abstract boolean hasRelationAttributes();
public abstract boolean hasRelationAttributeProperty(String propertyName);
public abstract StringTokenizer getRelationAttributes();
public abstract String getRelationAttributeName(String propertyName);
public abstract String getRelationAttributeKeyName(String propertyName);
public abstract String getRelationAttributeKey(String propertyName);
}

View File

@ -43,7 +43,8 @@ public class GenericContact extends ContentPage implements
public static final String ADDRESS = "address";
public static final String CONTACT_ENTRIES = "contactentries";
public static final String CONTACTS_KEY = GenericPersonContactCollection.CONTACTS_KEY;
private static final String RELATION_ATTRIBUTES = "GenericContactType;GenericContactEntryType";
private static final String RELATION_ATTRIBUTES = "person.link_key:GenericContactTypes;contactentries.key:GenericContactEntryKeys";
// Config
private static final GenericContactConfig s_config =
@ -232,8 +233,50 @@ public class GenericContact extends ContentPage implements
return !RELATION_ATTRIBUTES.isEmpty();
}
@Override
public boolean hasRelationAttributeProperty(String propertyName) {
StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";");
while(strTok.hasMoreTokens()) {
String token = strTok.nextToken();
if(token.startsWith(propertyName + ".")) {
return true;
}
}
return false;
}
@Override
public StringTokenizer getRelationAttributes() {
return new StringTokenizer(RELATION_ATTRIBUTES, ";");
}
@Override
public String getRelationAttributeKeyName(String propertyName) {
StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";");
while(strTok.hasMoreTokens()) {
String token = strTok.nextToken();
if(token.startsWith(propertyName + ".")) {
return token.substring(token.indexOf(".") + 1, token.indexOf(":"));
}
}
return null;
}
@Override
public String getRelationAttributeName(String propertyName) {
StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";");
while(strTok.hasMoreTokens()) {
String token = strTok.nextToken();
if(token.startsWith(propertyName + ".")) {
return token.substring(token.indexOf(":") + 1);
}
}
return null;
}
@Override
public String getRelationAttributeKey(String propertyName) {
return null;
}
}

View File

@ -21,17 +21,19 @@
package com.arsdigita.cms.contenttypes;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.RelationAttributeInterface;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.OID;
import java.math.BigDecimal;
import java.util.StringTokenizer;
import org.apache.log4j.Logger;
/**
*
* @author quasi
*/
public class GenericContactEntry extends ContentItem {
public class GenericContactEntry extends ContentItem implements RelationAttributeInterface {
public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.GenericContactEntry";
private static final String BASE_DATA_OBJECT_PACKAGE = "com.arsdigita.cms.contenttypes";
@ -43,6 +45,7 @@ public class GenericContactEntry extends ContentItem {
public static final String VALUE = "value";
public static final String DESCRIPTION = "description";
private static final String RELATION_ATTRIBUTES = "key.key:GenericContactEntryKeys";
/**
* Creates a new instance of GenericContactEntry
@ -111,4 +114,56 @@ public class GenericContactEntry extends ContentItem {
public void setDescription(String description) {
set(DESCRIPTION, description);
}
@Override
public boolean hasRelationAttributes() {
return !RELATION_ATTRIBUTES.isEmpty();
}
@Override
public boolean hasRelationAttributeProperty(String propertyName) {
StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";");
while(strTok.hasMoreTokens()) {
String token = strTok.nextToken();
if(token.startsWith(propertyName + ".")) {
return true;
}
}
return false;
}
@Override
public StringTokenizer getRelationAttributes() {
return new StringTokenizer(RELATION_ATTRIBUTES, ";");
}
@Override
public String getRelationAttributeKeyName(String propertyName) {
StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";");
while(strTok.hasMoreTokens()) {
String token = strTok.nextToken();
if(token.startsWith(propertyName + ".")) {
return token.substring(token.indexOf(".") + 1, token.indexOf(":"));
}
}
return null;
}
@Override
public String getRelationAttributeName(String propertyName) {
StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";");
while(strTok.hasMoreTokens()) {
String token = strTok.nextToken();
if(token.startsWith(propertyName + ".")) {
return token.substring(token.indexOf(":") + 1);
}
}
return null;
}
@Override
public String getRelationAttributeKey(String propertyName) {
return getKey();
}
}

View File

@ -48,7 +48,9 @@ public class GenericPerson extends ContentPage implements RelationAttributeInter
public static final String CONTACTS = "contacts";
public static final String CONTACTS_KEY = "link_key";
public static final String CONTACTS_ORDER = "link_order";
private static final String RELATION_ATTRIBUTES = "GenericContactType";
private static final String RELATION_ATTRIBUTES = "contacts.link_key:GenericContactType";
/** Data object type for this domain object */
public static final String BASE_DATA_OBJECT_TYPE =
"com.arsdigita.cms.contenttypes.GenericPerson";
@ -74,7 +76,6 @@ public class GenericPerson extends ContentPage implements RelationAttributeInter
public GenericPerson(String type) {
super(type);
//set(CONTACTS, null);
}
@Override
@ -170,7 +171,6 @@ public class GenericPerson extends ContentPage implements RelationAttributeInter
String fullname = getFullName();
if (fullname != null && !fullname.isEmpty()) {
setTitle(fullname);
//setName(GenericPerson.urlSave(fullname));
setName(GenericPerson.urlSave(String.format("%s %s", getSurname(), getGivenName())));
}
}
@ -201,16 +201,6 @@ public class GenericPerson extends ContentPage implements RelationAttributeInter
return !this.getContacts().isEmpty();
}
@Override
public boolean hasRelationAttributes() {
return !RELATION_ATTRIBUTES.isEmpty();
}
@Override
public StringTokenizer getRelationAttributes() {
return new StringTokenizer(RELATION_ATTRIBUTES, ";");
}
// Create a ulr save version of the full name
public static String urlSave(String in) {
@ -234,4 +224,56 @@ public class GenericPerson extends ContentPage implements RelationAttributeInter
return in;
}
@Override
public boolean hasRelationAttributes() {
return !RELATION_ATTRIBUTES.isEmpty();
}
@Override
public boolean hasRelationAttributeProperty(String propertyName) {
StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";");
while(strTok.hasMoreTokens()) {
String token = strTok.nextToken();
if(token.startsWith(propertyName + ".")) {
return true;
}
}
return false;
}
@Override
public StringTokenizer getRelationAttributes() {
return new StringTokenizer(RELATION_ATTRIBUTES, ";");
}
@Override
public String getRelationAttributeKeyName(String propertyName) {
StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";");
while(strTok.hasMoreTokens()) {
String token = strTok.nextToken();
if(token.startsWith(propertyName + ".")) {
return token.substring(token.indexOf(".") + 1, token.indexOf(":"));
}
}
return null;
}
@Override
public String getRelationAttributeName(String propertyName) {
StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";");
while(strTok.hasMoreTokens()) {
String token = strTok.nextToken();
if(token.startsWith(propertyName + ".")) {
return token.substring(token.indexOf(":") + 1);
}
}
return null;
}
@Override
public String getRelationAttributeKey(String propertyName) {
return null;
}
}

View File

@ -189,7 +189,7 @@ public abstract class DomainObjectTraversal {
s_log.debug("findAdapter for type " + type.getQualifiedName()
+ " in context " + context);
StringBuffer buf = new StringBuffer();
StringBuilder buf = new StringBuilder();
buf.append("Adapters contain:\n");
Iterator keys = s_adapters.keySet().iterator();
while (keys.hasNext()) {
@ -568,6 +568,7 @@ public abstract class DomainObjectTraversal {
m_context = context;
}
@Override
public boolean equals(Object o) {
if (o instanceof AdapterKey) {
AdapterKey k = (AdapterKey) o;
@ -577,10 +578,12 @@ public abstract class DomainObjectTraversal {
}
}
@Override
public int hashCode() {
return m_type.hashCode() + m_context.hashCode();
}
@Override
public String toString() {
return m_type.getQualifiedName() + ',' + m_context;
}
@ -595,5 +598,10 @@ public abstract class DomainObjectTraversal {
public LinkDomainObject(DataObject object) {
super(object);
}
@Override
public Object get(String attr) {
return super.get(attr);
}
}
}