/* * Copyright 2000-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jetspeed.om.profile; import java.util.StringTokenizer; import org.apache.jetspeed.om.security.Group; import org.apache.jetspeed.om.security.JetspeedUser; import org.apache.jetspeed.om.security.JetspeedUserFactory; import org.apache.jetspeed.om.security.Role; import org.apache.jetspeed.services.JetspeedSecurity; import org.apache.jetspeed.services.Profiler; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; /** * Interface definition for a Profile Locator. Locators are used by the profiler * to describe the parameters used to locate a resource in the persistent * configuration store. * * * @author <a href="mailto:taylor@apache.org">David Sean Taylor </a> * @author <a href="mailto:adambalk@cisco.com">Atul Dambalkar </a> */ public class BaseProfileLocator implements ProfileLocator { // instance state private String name = null; private String mediaType = null; private String language = null; private String country = null; private JetspeedUser user = null; private Role role = null; private Group group = null; private boolean anonymous = false; private String roleName = null; private String userName = null; private String groupName = null; /** 組織名 */ private String orgName = null; private static final String DELIM = "/"; /** * Static initialization of the logger for this class */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(BaseProfileLocator.class.getName()); /* * Gets the unique profile locator id, which is a combination of the params * This ID must follow the one of the 4 sequences below: * * <username>/ <mediaType>/ <language>/ <country>/ <page> <group>/ * <mediaType>/ <language>/ <country>/ <page> <role>/ <mediaType>/ <language>/ * <country>/ <page> * * * @return The profile locator id */ public String getId() { StringBuffer id = new StringBuffer(128); if (!anonymous && user != null) { id.append(Profiler.PARAM_USER).append(DELIM); id.append(user.getUserName()); } else if (group != null) { id.append(Profiler.PARAM_GROUP).append(DELIM); id.append(group.getName()); } else if (role != null) { id.append(Profiler.PARAM_ROLE).append(DELIM); id.append(role.getName()); } else { id.append(Profiler.PARAM_ANON); } if (language != null) { id.append(DELIM); id.append(language); } if (country != null) { id.append(DELIM); id.append(country); } if (mediaType != null) { id.append(DELIM); id.append(mediaType); } // if (orgName != null) { // id.append(DELIM); // id.append(orgName); // } if (name != null) { id.append(DELIM); id.append(name); } return id.toString(); } /* * Gets the unique profile locator path, which is a combination of the name * value pairs. This ID must follow the one of the 4 sequences below: * * user/ <name>/media-type/ <mediaType>/language/ <language> /country/ * <country>/ <page>/page * * group/ "" role/ "" * * * @return The profile locator path */ public String getPath() { StringBuffer id = new StringBuffer(128); if (!anonymous && user != null) { id.append(Profiler.PARAM_USER).append(DELIM); id.append(user.getUserName()).append(DELIM); } else if (group != null) { id.append(Profiler.PARAM_GROUP).append(DELIM); id.append(group.getName()).append(DELIM); } else if (role != null) { id.append(Profiler.PARAM_ROLE).append(DELIM); id.append(role.getName()).append(DELIM); } else { id.append(Profiler.PARAM_USER).append(DELIM); id.append(Profiler.PARAM_ANON).append(DELIM); } if (language != null) { id.append(Profiler.PARAM_LANGUAGE).append(DELIM); id.append(language).append(DELIM); } if (country != null) { id.append(Profiler.PARAM_COUNTRY).append(DELIM); id.append(country).append(DELIM); } if (mediaType != null) { id.append(Profiler.PARAM_MEDIA_TYPE).append(DELIM); id.append(mediaType).append(DELIM); } // if (orgName != null) { // id.append(Profiler.PARAM_ORG).append(DELIM); // id.append(orgName).append(DELIM); // } if (name != null) { id.append(Profiler.PARAM_PAGE).append(DELIM); id.append(name).append(DELIM); } id.deleteCharAt(id.length() - 1); return id.toString(); } /* * populates this profile locator from a given path in the format: * * user/ <name>/media-type/ <mediaType>/language/ <language> /country/ * <country>/ <page>/page * * group/ "" role/ "" * * @param path The formatted profiler path string. */ public void createFromPath(String path) { StringTokenizer tok = new StringTokenizer(path, "/"); while (tok.hasMoreTokens()) { String name = (String) tok.nextToken(); if (name.equals(Profiler.PARAM_USER) && tok.hasMoreTokens()) { try { // keep profile locator from failing if the user has been removed // from security as it may still exist in the PSML structure. this.userName = tok.nextToken(); this.setUser(JetspeedSecurity.getUser(this.userName)); } catch (Exception e) { logger.error("ProfileLocator: Failed to set User: ", e); } } else if (name.equals(Profiler.PARAM_GROUP) && tok.hasMoreTokens()) { try { // keep profile locator from failing if the group has been removed // from security as it may still exist in the PSML structure. this.groupName = tok.nextToken(); this.setGroup(JetspeedSecurity.getGroup(this.groupName)); } catch (Exception e) { logger.error("ProfileLocator: Failed to set Group: ", e); } } else if (name.equals(Profiler.PARAM_ROLE) && tok.hasMoreTokens()) { try { // keep profile locator from failing if the role has been removed // from security as it may still exist in the PSML structure. this.roleName = tok.nextToken(); this.setRole(JetspeedSecurity.getRole(this.roleName)); } catch (Exception e) { logger.error("ProfileLocator: Failed to set Role: ", e); } } else if (name.equals(Profiler.PARAM_PAGE) && tok.hasMoreTokens()) { this.setName(tok.nextToken()); } else if (name.equals(Profiler.PARAM_MEDIA_TYPE) && tok.hasMoreTokens()) { this.setMediaType(tok.nextToken()); } else if (name.equals(Profiler.PARAM_LANGUAGE) && tok.hasMoreTokens()) { this.setLanguage(tok.nextToken()); } else if (name.equals(Profiler.PARAM_COUNTRY) && tok.hasMoreTokens()) { this.setCountry(tok.nextToken()); } // } else if (name.equals(Profiler.PARAM_ORG) && tok.hasMoreTokens()) { // this.setOrgName(tok.nextToken()); // } } } /** * @see Object#clone * @return an instance copy of this object */ public Object clone() throws java.lang.CloneNotSupportedException { return super.clone(); } /* * Gets the resource name parameter for this profile. * * @return The resource name parameter for this profile. */ public String getName() { return name; } /* * Sets the resource name parameter for this profile. * * @param The resource name parameter for this profile. */ public void setName(String name) { this.name = name; } /* * Gets the anonymous user flag for this profile. * * @param The user parameter for this profile. */ public boolean getAnonymous() { return this.anonymous; } /* * Sets the user parameter as the anonymous user * * @param anonymous True indicates this is an anonymous user. */ public void setAnonymous(boolean anonymous) { try { JetspeedUser user = JetspeedUserFactory.getInstance(); user.setUserName(JetspeedSecurity.getAnonymousUserName()); this.setUser(user); } catch (Exception e) { logger.error("Could not get Anonymous user", e); } finally { this.anonymous = anonymous; } } /* * Gets the media type parameter for this profile. Media types are values such * as html, wml, xml ... * * @return The media type parameter for this profile. */ public String getMediaType() { return mediaType; } /* * Sets the media type parameter for this profile. Media types are values such * as html, wml, xml ... * * @param The media type parameter for this profile. */ public void setMediaType(String mediaType) { this.mediaType = mediaType; } /* * Gets the language parameter for this profile. Language values are ISO-639 * standard language abbreviations en, fr, de, ... * * @return The language parameter for this profile. */ public String getLanguage() { return language; } /* * Sets the language parameter for this profile. Language values are ISO-639 * standard language abbreviations en, fr, de, ... * * @param The language parameter for this profile. */ public void setLanguage(String language) { this.language = language; } /* * Gets the country code parameter for this profile. Country code values are * ISO-3166 standard country code abbreviations. GB, US, FR, CA, DE, ... * * @return The country code parameter for this profile. */ public String getCountry() { return country; } /* * Sets the country code parameter for this profile. Country code values are * ISO-3166 standard country code abbreviations. GB, US, FR, CA, DE, ... * * @param The country code parameter for this profile. */ public void setCountry(String country) { this.country = country; } /* * Gets the user parameter for this profile. * * @return The user parameter for this profile. */ public JetspeedUser getUser() { return user; } public String getUserName() { if (null == user) return userName; return user.getUserName(); } /* * Sets the user parameter for this profile. * * @param The user parameter for this profile. */ public void setUser(JetspeedUser user) { this.user = user; } /* * Gets the role parameter for this profile. * * @return The role parameter for this profile. */ public Role getRole() { return role; } public String getRoleName() { if (null == role) return roleName; return role.getName(); } /* * Sets the role parameter for this profile. * * @param The role parameter for this profile. */ public void setRole(Role role) { this.role = role; } public void setRoleByName(String roleName) { try { Role temp = JetspeedSecurity.getRole(roleName); if (null != temp) { role = temp; } } catch (Exception e) { logger.error("ProfileLocator: Failed to set Role " + roleName, e); } } /* * Gets the group parameter for this profile. * * @return The group parameter for this profile. */ public Group getGroup() { return group; } public String getGroupName() { if (null == group) return groupName; return group.getName(); } /* * Sets the group parameter for this profile. * * @param The group parameter for this profile. */ public void setGroup(Group group) { this.group = group; } public void setGroupByName(String groupName) { try { Group temp = JetspeedSecurity.getGroup(groupName); if (null != temp) { group = temp; } } catch (Exception e) { logger.error("ProfileLocator: Failed to set Group: " + e); } } public void setOrgName(String orgName) { this.orgName = orgName; } public String getOrgName() { return orgName; } /* * Comparision Functions. Contributed by Atul Dambalkar */ /** * Define equality criteria for ProfileLocator objects. * * @param obj * ProfileLocator object to be compared with. */ public boolean equals(Object obj) { if (obj == null) { return false; } synchronized (obj) { if (!(obj instanceof ProfileLocator)) { return false; } ProfileLocator locator = (ProfileLocator) obj; String name = locator.getName(); String mediaType = locator.getMediaType(); String language = locator.getLanguage(); String country = locator.getCountry(); Group group = locator.getGroup(); Role role = locator.getRole(); // String orgName = locator.getOrgName(); return nameEquals(name) // && locator.getId() == id // && orgNameEquals(orgName) && mediaTypeEquals(mediaType) && mediaTypeEquals(mediaType) && languageEquals(language) && countryEquals(country) && userEquals(locator) && groupEquals(group) && roleEquals(role); } } /** * Check equality for given User object with this ProfileLocator's User * object. */ private boolean userEquals(ProfileLocator locator) { JetspeedUser user = locator.getUser(); // if either of reference is null return false. if (exclusiveOr(this.user, user)) { return false; } // check if both are non-nulls if (assertNotNull(this.user) && assertNotNull(user)) { return stringEquals(this.user.getUserName(), user.getUserName()); } // can be anonymous user return this.anonymous == locator.getAnonymous(); } /** * Check equality for given Group object with this ProfileLocator's Group * object. */ private boolean groupEquals(Group group) { // if either of reference is null return false. if (exclusiveOr(this.group, group)) { return false; } // check if both are non-nulls if (assertNotNull(this.group) && assertNotNull(group)) { return stringEquals(this.group.getName(), group.getName()); } // both are null return true; } /** * Check equality for given Role object with this ProfileLocator's Role * object. */ private boolean roleEquals(Role role) { // if either of reference is null return false. if (exclusiveOr(this.role, role)) { return false; } // check if both are non-nulls if (assertNotNull(this.role) && assertNotNull(role)) { return stringEquals(this.role.getName(), role.getName()); } // both are null return true; } /** * Check equality for language object with this ProfileLocator's language * object. */ private boolean languageEquals(String language) { return stringEquals(this.language, language); } /** * Check equality for country object with this ProfileLocator's country * object. */ private boolean countryEquals(String country) { return stringEquals(this.country, country); } /** * Check equality for name object with this ProfileLocator's name object. */ private boolean nameEquals(String name) { return stringEquals(this.name, name); } /** * Check equality for name object with this ProfileLocator's name object. */ private boolean orgNameEquals(String orgName) { return stringEquals(this.orgName, orgName); } /** * Check equality for name object with this ProfileLocator's name object. */ private boolean mediaTypeEquals(String mediaType) { return stringEquals(this.mediaType, mediaType); } /** * AssertNotNull the two String objects and then check the equality. */ private boolean stringEquals(String str1, String str2) { if (exclusiveOr(str1, str2)) { return false; } if (assertNotNull(str1) && assertNotNull(str2)) { return str1.equals(str2); } // both are null return true; } /** * AssertNotNull the given object. */ private boolean assertNotNull(Object object) { return object != null; } /** * Exclusive or the two objects fro their references null-ability. */ private boolean exclusiveOr(Object obj1, Object obj2) { return (assertNotNull(obj1) && !assertNotNull(obj2)) || (!assertNotNull(obj1) && assertNotNull(obj2)); } }