001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common Development
008: * and Distribution License("CDDL") (collectively, the "License"). You
009: * may not use this file except in compliance with the License. You can obtain
010: * a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
011: * or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
012: * language governing permissions and limitations under the License.
013: *
014: * When distributing the software, include this License Header Notice in each
015: * file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
016: * Sun designates this particular file as subject to the "Classpath" exception
017: * as provided by Sun in the GPL Version 2 section of the License file that
018: * accompanied this code. If applicable, add the following below the License
019: * Header, with the fields enclosed by brackets [] replaced by your own
020: * identifying information: "Portions Copyrighted [year]
021: * [name of copyright owner]"
022: *
023: * Contributor(s):
024: *
025: * If you wish your version of this file to be governed by only the CDDL or
026: * only the GPL Version 2, indicate your decision by adding "[Contributor]
027: * elects to include this software in this distribution under the [CDDL or GPL
028: * Version 2] license." If you don't indicate a single choice of license, a
029: * recipient has the option to distribute your version of this file under
030: * either the CDDL, the GPL Version 2 or to extend the choice of license to
031: * its licensees as provided above. However, if you add GPL Version 2 code
032: * and therefore, elected the GPL Version 2 license, then the option applies
033: * only if the new code is made subject to such option by the copyright
034: * holder.
035: */
036:
037: package com.sun.xml.ws.policy;
038:
039: import com.sun.xml.ws.policy.privateutil.LocalizationMessages;
040: import com.sun.xml.ws.policy.privateutil.PolicyLogger;
041: import com.sun.xml.ws.policy.privateutil.PolicyUtils;
042: import java.util.Collection;
043: import java.util.LinkedList;
044: import java.util.List;
045:
046: /**
047: * A PolicySubject is an entity (e.g., a port, operation, binding,
048: * service) with which a policy can be associated.
049: */
050: public final class PolicySubject {
051: private static final PolicyLogger LOGGER = PolicyLogger
052: .getLogger(PolicySubject.class);
053:
054: private final List<Policy> policies = new LinkedList<Policy>();
055: private final Object subject;
056:
057: /**
058: * Constructs a policy subject instance.
059: *
060: * @param subject object to which the policies are attached. Must not be {@code null}.
061: * @param policy first policy attached to the subject. Must not be {@code null}.
062: *
063: * @throws IllegalArgumentException in case any of the arguments is {@code null}.
064: */
065: public PolicySubject(Object subject, Policy policy)
066: throws IllegalArgumentException {
067: if (subject == null || policy == null) {
068: throw LOGGER
069: .logSevereException(new IllegalArgumentException(
070: LocalizationMessages
071: .WSP_0021_SUBJECT_AND_POLICY_PARAM_MUST_NOT_BE_NULL(
072: subject, policy)));
073: }
074:
075: this .subject = subject;
076: this .attach(policy);
077: }
078:
079: /**
080: * Constructs a policy subject instance.
081: *
082: * @param subject object to which the policies are attached. Must not be {@code null}.
083: * @param policies first policy attached to the subject. Must not be {@code null}.
084: *
085: * @throws IllegalArgumentException in case any of the arguments is {@code null} or
086: * in case {@code policies} argument represents empty collection.
087: */
088: public PolicySubject(Object subject, Collection<Policy> policies)
089: throws IllegalArgumentException {
090: if (subject == null || policies == null) {
091: throw LOGGER
092: .logSevereException(new IllegalArgumentException(
093: LocalizationMessages
094: .WSP_0062_INPUT_PARAMS_MUST_NOT_BE_NULL()));
095: }
096:
097: if (policies.isEmpty()) {
098: throw LOGGER
099: .logSevereException(new IllegalArgumentException(
100: LocalizationMessages
101: .WSP_0064_INITIAL_POLICY_COLLECTION_MUST_NOT_BE_EMPTY()));
102: }
103:
104: this .subject = subject;
105: this .policies.addAll(policies);
106: }
107:
108: /**
109: * Attaches another Policy instance to the policy subject.
110: *
111: * @param policy new policy instance to be attached to this subject
112: *
113: * @throws IllegalArgumentException in case {@code policy} argument is {@code null}.
114: */
115: public void attach(final Policy policy) {
116: if (policy == null) {
117: throw LOGGER
118: .logSevereException(new IllegalArgumentException(
119: LocalizationMessages
120: .WSP_0038_POLICY_TO_ATTACH_MUST_NOT_BE_NULL()));
121: }
122: this .policies.add(policy);
123: }
124:
125: /**
126: * Returns the effective policy of the subject, i.e. all policies of the subject
127: * merged together.
128: *
129: * @return effective policy of the subject
130: */
131: public Policy getEffectivePolicy(final PolicyMerger merger)
132: throws PolicyException {
133: return merger.merge(policies);
134: }
135:
136: /**
137: * Retrieve only the assertions of the effective policy that match the given set of
138: * namespaces
139: */
140: public Policy getEffectivePolicy(
141: final Collection<String> namespaces,
142: final PolicyMerger merger) throws PolicyException {
143: final LinkedList<Policy> reducedPolicies = new LinkedList<Policy>();
144: for (Policy policy : policies) {
145: // Policy reducedPolicy = policy.reduce(namespaces);
146: // reducedPolicies.add(reducedPolicy);
147: }
148: return merger.merge(reducedPolicies);
149: }
150:
151: /**
152: * A unique identifier of the subject
153: *
154: * Subjects may not always be uniquely identifiable. Also, once the subject is
155: * assigned to a scope, its identity may not matter anymore. Therefore this
156: * may be null.
157: */
158: public Object getSubject() {
159: return this .subject;
160: }
161:
162: /**
163: * An {@code Object.toString()} method override.
164: */
165: public String toString() {
166: return toString(0, new StringBuffer()).toString();
167: }
168:
169: /**
170: * A helper method that appends indented string representation of this instance to the input string buffer.
171: *
172: * @param indentLevel indentation level to be used.
173: * @param buffer buffer to be used for appending string representation of this instance
174: * @return modified buffer containing new string representation of the instance
175: */
176: StringBuffer toString(final int indentLevel,
177: final StringBuffer buffer) {
178: final String indent = PolicyUtils.Text
179: .createIndent(indentLevel);
180: final String innerIndent = PolicyUtils.Text
181: .createIndent(indentLevel + 1);
182:
183: buffer.append(indent).append("policy subject {").append(
184: PolicyUtils.Text.NEW_LINE);
185: buffer.append(innerIndent).append("subject = '")
186: .append(subject).append('\'').append(
187: PolicyUtils.Text.NEW_LINE);
188: for (Policy policy : policies) {
189: policy.toString(indentLevel + 1, buffer).append(
190: PolicyUtils.Text.NEW_LINE);
191: }
192: buffer.append(indent).append('}');
193:
194: return buffer;
195: }
196: }
|