Author: rgodfrey
Date: Fri Jul 15 16:05:14 2016
New Revision: 1752846
URL: http://svn.apache.org/viewvc?rev=1752846&view=rev
Log:
QPID-7318 : Reduce code duplication in ACL implementations
Added:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CommonAccessControlProvider.java
(with props)
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/AbstractAccessControlProvider.java
(with props)
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRulesBasedAccessControlProvider.java
(with props)
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractLegacyAccessControlProvider.java
- copied, changed from r1752845,
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractRuleBasedAccessControlProvider.java
Removed:
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractRuleBasedAccessControlProvider.java
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AccessControlProvider.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAccessControlProvider.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AllowAllAccessControlProviderImpl.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImpl.java
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedAccessControlProviderImpl.java
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedVirtualHostAccessControlProviderImpl.java
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AccessControlProvider.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AccessControlProvider.java?rev=1752846&r1=1752845&r2=1752846&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AccessControlProvider.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AccessControlProvider.java
Fri Jul 15 16:05:14 2016
@@ -19,37 +19,10 @@
*/
package org.apache.qpid.server.model;
-import java.util.Comparator;
-
-import org.apache.qpid.server.security.AccessControl;
-
@ManagedObject
-public interface AccessControlProvider<X extends AccessControlProvider<X>>
extends ConfiguredObject<X>, Comparable<AccessControlProvider>
+public interface AccessControlProvider<X extends AccessControlProvider<X>>
extends ConfiguredObject<X>,
CommonAccessControlProvider<AccessControlProvider<?>>
{
- String PRIORITY = "priority";
-
- Comparator<AccessControlProvider> ACCESS_CONTROL_POVIDER_COMPARATOR = new
Comparator<AccessControlProvider>()
- {
- @Override
- public int compare(final AccessControlProvider o1, final
AccessControlProvider o2)
- {
- if(o1.getPriority() < o2.getPriority())
- {
- return -1;
- }
- else if (o1.getPriority() > o2.getPriority())
- {
- return 1;
- }
- else
- {
- return o1.getName().compareTo(o2.getName());
- }
- }
- };
-
@ManagedAttribute(defaultValue = "10")
int getPriority();
- //retrieve the underlying AccessControl object
- AccessControl getAccessControl();
+
}
Added:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CommonAccessControlProvider.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CommonAccessControlProvider.java?rev=1752846&view=auto
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CommonAccessControlProvider.java
(added)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CommonAccessControlProvider.java
Fri Jul 15 16:05:14 2016
@@ -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.qpid.server.model;
+
+import java.util.Comparator;
+
+import org.apache.qpid.server.security.AccessControl;
+
+public interface CommonAccessControlProvider<X> extends Comparable<X>
+{
+ String PRIORITY = "priority";
+
+ Comparator<? super CommonAccessControlProvider>
ACCESS_CONTROL_PROVIDER_COMPARATOR = new
Comparator<CommonAccessControlProvider>()
+ {
+ @Override
+ public int compare(final CommonAccessControlProvider o1, final
CommonAccessControlProvider o2)
+ {
+ if(o1.getPriority() < o2.getPriority())
+ {
+ return -1;
+ }
+ else if (o1.getPriority() > o2.getPriority())
+ {
+ return 1;
+ }
+ else
+ {
+ return o1.getName().compareTo(o2.getName());
+ }
+ }
+ };
+
+ String getName();
+ int getPriority();
+ AccessControl getAccessControl();
+}
Propchange:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CommonAccessControlProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAccessControlProvider.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAccessControlProvider.java?rev=1752846&r1=1752845&r2=1752846&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAccessControlProvider.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAccessControlProvider.java
Fri Jul 15 16:05:14 2016
@@ -25,33 +25,8 @@ import java.util.Comparator;
import org.apache.qpid.server.security.AccessControl;
@ManagedObject( creatable = false )
-public interface VirtualHostAccessControlProvider<X extends
VirtualHostAccessControlProvider<X>> extends ConfiguredObject<X>,
Comparable<VirtualHostAccessControlProvider>
+public interface VirtualHostAccessControlProvider<X extends
VirtualHostAccessControlProvider<X>> extends ConfiguredObject<X>,
CommonAccessControlProvider<VirtualHostAccessControlProvider<?>>
{
- String PRIORITY = "priority";
-
- Comparator<VirtualHostAccessControlProvider>
VIRTUAL_HOST_ACCESS_CONTROL_POVIDER_COMPARATOR = new
Comparator<VirtualHostAccessControlProvider>()
- {
- @Override
- public int compare(final VirtualHostAccessControlProvider o1, final
VirtualHostAccessControlProvider o2)
- {
- if(o1.getPriority() < o2.getPriority())
- {
- return -1;
- }
- else if (o1.getPriority() > o2.getPriority())
- {
- return 1;
- }
- else
- {
- return o1.getName().compareTo(o2.getName());
- }
- }
- };
-
-
@ManagedAttribute(defaultValue = "10")
int getPriority();
-
- AccessControl getAccessControl();
}
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java?rev=1752846&r1=1752845&r2=1752846&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
Fri Jul 15 16:05:14 2016
@@ -820,7 +820,7 @@ public class BrokerAdapter extends Abstr
if(!isManagementMode())
{
List<AccessControlProvider> children = new
ArrayList<>(getChildren(AccessControlProvider.class));
- Collections.sort(children,
AccessControlProvider.ACCESS_CONTROL_POVIDER_COMPARATOR);
+ Collections.sort(children,
CommonAccessControlProvider.ACCESS_CONTROL_PROVIDER_COMPARATOR);
List<AccessControl<?>> accessControls = new
ArrayList<>(children.size()+1);
accessControls.add(_systemUserAllowed);
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AllowAllAccessControlProviderImpl.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AllowAllAccessControlProviderImpl.java?rev=1752846&r1=1752845&r2=1752846&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AllowAllAccessControlProviderImpl.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AllowAllAccessControlProviderImpl.java
Fri Jul 15 16:05:14 2016
@@ -96,8 +96,8 @@ public class AllowAllAccessControlProvid
}
@Override
- public int compareTo(final AccessControlProvider o)
+ public int compareTo(final AccessControlProvider<?> o)
{
- return ACCESS_CONTROL_POVIDER_COMPARATOR.compare(this, o);
+ return ACCESS_CONTROL_PROVIDER_COMPARATOR.compare(this, o);
}
}
Added:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/AbstractAccessControlProvider.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/AbstractAccessControlProvider.java?rev=1752846&view=auto
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/AbstractAccessControlProvider.java
(added)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/AbstractAccessControlProvider.java
Fri Jul 15 16:05:14 2016
@@ -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 org.apache.qpid.server.security.access;
+
+import java.util.Map;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import org.apache.qpid.server.logging.EventLogger;
+import org.apache.qpid.server.logging.EventLoggerProvider;
+import org.apache.qpid.server.logging.messages.AccessControlMessages;
+import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.CommonAccessControlProvider;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.StateTransition;
+import org.apache.qpid.server.security.AccessControl;
+
+
+public abstract class AbstractAccessControlProvider<X extends
AbstractAccessControlProvider<X,Y,T>, Y extends CommonAccessControlProvider<Y>,
T extends EventLoggerProvider & ConfiguredObject<?>>
+ extends AbstractConfiguredObject<X> implements EventLoggerProvider,
CommonAccessControlProvider<Y>
+{
+ private final EventLogger _eventLogger;
+ @ManagedAttributeField
+ private int _priority;
+
+
+ public AbstractAccessControlProvider(Map<String, Object> attributes, T
parent)
+ {
+ super(parentsMap(parent), attributes);
+
+ _eventLogger = parent.getEventLogger();
+ _eventLogger.message(AccessControlMessages.CREATE(getName()));
+
+
+ }
+
+ @Override
+ public EventLogger getEventLogger()
+ {
+ return _eventLogger;
+ }
+
+ public final int getPriority()
+ {
+ return _priority;
+ }
+
+ public abstract AccessControl getAccessControl();
+
+ @Override
+ public int compareTo(final Y o)
+ {
+ return ACCESS_CONTROL_PROVIDER_COMPARATOR.compare((Y)this, o);
+ }
+
+ @StateTransition(currentState = State.UNINITIALIZED, desiredState =
State.QUIESCED)
+ @SuppressWarnings("unused")
+ private ListenableFuture<Void> startQuiesced()
+ {
+ setState(State.QUIESCED);
+ return Futures.immediateFuture(null);
+ }
+
+ @StateTransition(currentState = {State.ACTIVE, State.QUIESCED,
State.ERRORED}, desiredState = State.DELETED)
+ @SuppressWarnings("unused")
+ private ListenableFuture<Void> doDelete()
+ {
+ return doAfterAlways(closeAsync(),
+ new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ setState(State.DELETED);
+ deleted();
+
getEventLogger().message(AccessControlMessages.DELETE(getName()));
+ }
+ });
+ }
+
+}
Propchange:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/AbstractAccessControlProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java?rev=1752846&r1=1752845&r2=1752846&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
Fri Jul 15 16:05:14 2016
@@ -308,7 +308,7 @@ public abstract class AbstractVirtualHos
{
List<VirtualHostAccessControlProvider> children = new
ArrayList<>(getChildren(VirtualHostAccessControlProvider.class));
_logger.debug("Updating access control list with {} provider
children", children.size());
- Collections.sort(children,
VirtualHostAccessControlProvider.VIRTUAL_HOST_ACCESS_CONTROL_POVIDER_COMPARATOR);
+ Collections.sort(children,
VirtualHostAccessControlProvider.ACCESS_CONTROL_PROVIDER_COMPARATOR);
List<AccessControl<?>> accessControls = new
ArrayList<>(children.size()+2);
accessControls.add(_systemUserAllowed);
Modified:
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImpl.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImpl.java?rev=1752846&r1=1752845&r2=1752846&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImpl.java
(original)
+++
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImpl.java
Fri Jul 15 16:05:14 2016
@@ -32,7 +32,6 @@ import org.slf4j.LoggerFactory;
import org.apache.qpid.server.configuration.IllegalConfigurationException;
import org.apache.qpid.server.model.AccessControlProvider;
import org.apache.qpid.server.model.Broker;
-import org.apache.qpid.server.model.BrokerModel;
import org.apache.qpid.server.model.ManagedAttributeField;
import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
import org.apache.qpid.server.model.State;
@@ -43,7 +42,7 @@ import org.apache.qpid.server.security.a
import org.apache.qpid.server.util.urlstreamhandler.data.Handler;
public class ACLFileAccessControlProviderImpl
- extends
AbstractRuleBasedAccessControlProvider<ACLFileAccessControlProviderImpl>
+ extends
AbstractLegacyAccessControlProvider<ACLFileAccessControlProviderImpl,
Broker<?>, AccessControlProvider<?>>
implements
ACLFileAccessControlProvider<ACLFileAccessControlProviderImpl>
{
private static final Logger LOGGER =
LoggerFactory.getLogger(ACLFileAccessControlProviderImpl.class);
@@ -129,9 +128,9 @@ public class ACLFileAccessControlProvide
return _path;
}
- public int compareTo(final AccessControlProvider o)
+ public int compareTo(final AccessControlProvider<?> o)
{
- return ACCESS_CONTROL_POVIDER_COMPARATOR.compare(this, o);
+ return ACCESS_CONTROL_PROVIDER_COMPARATOR.compare(this, o);
}
}
Added:
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRulesBasedAccessControlProvider.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRulesBasedAccessControlProvider.java?rev=1752846&view=auto
==============================================================================
---
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRulesBasedAccessControlProvider.java
(added)
+++
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRulesBasedAccessControlProvider.java
Fri Jul 15 16:05:14 2016
@@ -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.qpid.server.security.access.plugins;
+
+import static
org.apache.qpid.server.security.access.plugins.RuleBasedAccessControlProvider.DEFAULT_RESULT;
+import static
org.apache.qpid.server.security.access.plugins.RuleBasedAccessControlProvider.RULES;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.qpid.server.logging.EventLoggerProvider;
+import org.apache.qpid.server.model.CommonAccessControlProvider;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Content;
+import org.apache.qpid.server.model.CustomRestHeaders;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.RestContentHeader;
+import org.apache.qpid.server.security.Result;
+import org.apache.qpid.server.security.access.RuleOutcome;
+import org.apache.qpid.server.security.access.config.AclAction;
+import org.apache.qpid.server.security.access.config.AclFileParser;
+import org.apache.qpid.server.security.access.config.AclRulePredicates;
+import org.apache.qpid.server.security.access.config.LegacyOperation;
+import org.apache.qpid.server.security.access.config.ObjectProperties;
+import org.apache.qpid.server.security.access.config.ObjectType;
+import org.apache.qpid.server.security.access.config.Rule;
+import org.apache.qpid.server.security.access.config.RuleBasedAccessControl;
+import org.apache.qpid.server.security.access.config.RuleSet;
+
+
+abstract class AbstractCommonRulesBasedAccessControlProvider<X extends
AbstractCommonRulesBasedAccessControlProvider<X,T,Y>, T extends
EventLoggerProvider & ConfiguredObject<?>, Y extends
CommonAccessControlProvider<Y>>
+ extends AbstractLegacyAccessControlProvider<X, T, Y> implements
EventLoggerProvider
+{
+
+ @ManagedAttributeField
+ private Result _defaultResult;
+ @ManagedAttributeField
+ private List<AclRule> _rules;
+
+ AbstractCommonRulesBasedAccessControlProvider(final Map<String, Object>
attributes, final T parent)
+ {
+ super(attributes, parent);
+ }
+
+ @Override
+ protected void changeAttributes(final Map<String, Object> attributes)
+ {
+ super.changeAttributes(attributes);
+
if(attributes.containsKey(RuleBasedVirtualHostAccessControlProvider.DEFAULT_RESULT)
|| attributes.containsKey(
+ RuleBasedVirtualHostAccessControlProvider.RULES))
+ {
+ recreateAccessController();
+ }
+ }
+
+ protected RuleBasedAccessControl createRuleBasedAccessController()
+ {
+ List<Rule> rules = new ArrayList<>();
+ for(AclRule configuredRule : _rules)
+ {
+ rules.add(new Rule(configuredRule.getIdentity(),
+ new AclAction(configuredRule.getOperation(),
+ configuredRule.getObjectType(),
+ new
AclRulePredicates(configuredRule.getAttributes())),
+ configuredRule.getOutcome()));
+ }
+ return new RuleBasedAccessControl(new RuleSet(this, rules,
_defaultResult), getModel());
+ }
+
+ public Result getDefaultResult()
+ {
+ return _defaultResult;
+ }
+
+ public List<AclRule> getRules()
+ {
+ return _rules;
+ }
+
+
+ public void loadFromFile(final String path)
+ {
+ RuleSet ruleSet = AclFileParser.parse(path, this);
+ List<AclRule> aclRules = new ArrayList<>();
+ for(Rule rule : ruleSet.getAllRules())
+ {
+ aclRules.add(new AclRuleImpl(rule));
+ }
+ Map<String,Object> attrs = new HashMap<>();
+ attrs.put(DEFAULT_RESULT, ruleSet.getDefault());
+ attrs.put(RULES, aclRules);
+ setAttributes(attrs);
+ }
+
+
+ public static class AclRuleImpl implements AclRule
+ {
+ private final Rule _rule;
+
+ AclRuleImpl(final Rule rule)
+ {
+ _rule = rule;
+ }
+
+ @Override
+ public String getIdentity()
+ {
+ return _rule.getIdentity();
+ }
+
+ @Override
+ public ObjectType getObjectType()
+ {
+ return _rule.getAction().getObjectType();
+ }
+
+ @Override
+ public LegacyOperation getOperation()
+ {
+ return _rule.getAction().getOperation();
+ }
+
+ @Override
+ public Map<ObjectProperties.Property, String> getAttributes()
+ {
+ return _rule.getAction().getProperties().asPropertyMap();
+ }
+
+ @Override
+ public RuleOutcome getOutcome()
+ {
+ return _rule.getRuleOutcome();
+ }
+ }
+
+ public Content extractRules()
+ {
+ StringBuilder sb = new StringBuilder();
+ for(AclRule rule : _rules)
+ {
+ sb.append("ACL ");
+ sb.append(rule.getOutcome().name().replace('_','-'));
+ sb.append(' ');
+ sb.append(rule.getIdentity());
+ sb.append(' ');
+ sb.append(rule.getOperation().name());
+ sb.append(' ');
+ sb.append(rule.getObjectType().name());
+ for(Map.Entry<ObjectProperties.Property,String> entry :
rule.getAttributes().entrySet())
+ {
+ sb.append(' ');
+ sb.append(entry.getKey().getCanonicalName());
+ sb.append(" = \"");
+ sb.append(entry.getValue());
+ sb.append("\"");
+ }
+ sb.append('\n');
+ }
+ return new StringContent(sb.toString());
+ }
+
+ private static class StringContent implements Content, CustomRestHeaders
+ {
+
+ private final String _content;
+
+ public StringContent(final String content)
+ {
+ _content = content;
+ }
+
+ @Override
+ public void write(final OutputStream outputStream) throws IOException
+ {
+ outputStream.write(_content.getBytes(StandardCharsets.UTF_8));
+ }
+
+ @RestContentHeader("Content-Type")
+ public String getContentType()
+ {
+ return "text/plain";
+ }
+
+ @Override
+ public void release()
+ {
+
+ }
+ }
+
+}
Propchange:
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRulesBasedAccessControlProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied:
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractLegacyAccessControlProvider.java
(from r1752845,
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractRuleBasedAccessControlProvider.java)
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractLegacyAccessControlProvider.java?p2=qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractLegacyAccessControlProvider.java&p1=qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractRuleBasedAccessControlProvider.java&r1=1752845&r2=1752846&rev=1752846&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractRuleBasedAccessControlProvider.java
(original)
+++
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractLegacyAccessControlProvider.java
Fri Jul 15 16:05:14 2016
@@ -28,25 +28,21 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.qpid.server.configuration.IllegalConfigurationException;
-import org.apache.qpid.server.logging.EventLogger;
import org.apache.qpid.server.logging.EventLoggerProvider;
-import org.apache.qpid.server.logging.messages.AccessControlMessages;
-import org.apache.qpid.server.model.AbstractConfiguredObject;
-import org.apache.qpid.server.model.AccessControlProvider;
-import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.CommonAccessControlProvider;
import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.ManagedAttributeField;
-import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
import org.apache.qpid.server.model.State;
import org.apache.qpid.server.model.StateTransition;
+import org.apache.qpid.server.model.SystemConfig;
import org.apache.qpid.server.security.AccessControl;
+import org.apache.qpid.server.security.access.AbstractAccessControlProvider;
import org.apache.qpid.server.security.access.config.RuleBasedAccessControl;
import org.apache.qpid.server.util.urlstreamhandler.data.Handler;
-public abstract class AbstractRuleBasedAccessControlProvider<X extends
AbstractRuleBasedAccessControlProvider<X>>
- extends AbstractConfiguredObject<X> implements EventLoggerProvider
+abstract class AbstractLegacyAccessControlProvider<X extends
AbstractLegacyAccessControlProvider<X,T,Y>, T extends EventLoggerProvider &
ConfiguredObject<?>, Y extends CommonAccessControlProvider<Y>>
+ extends AbstractAccessControlProvider<X, Y, T> implements
EventLoggerProvider
{
- private static final Logger LOGGER =
LoggerFactory.getLogger(AbstractRuleBasedAccessControlProvider.class);
+ private static final Logger LOGGER =
LoggerFactory.getLogger(AbstractLegacyAccessControlProvider.class);
static
{
@@ -54,23 +50,12 @@ public abstract class AbstractRuleBasedA
}
private volatile RuleBasedAccessControl _accessControl;
- private final EventLogger _eventLogger;
- @ManagedAttributeField
- private int _priority;
- public AbstractRuleBasedAccessControlProvider(Map<String, Object>
attributes, ConfiguredObject<?> parent)
+ AbstractLegacyAccessControlProvider(Map<String, Object> attributes, T
parent)
{
- super(parentsMap(parent), attributes);
+ super(attributes, parent);
-
- _eventLogger = ((EventLoggerProvider)parent).getEventLogger();
- _eventLogger.message(AccessControlMessages.CREATE(getName()));
- }
-
- public final EventLogger getEventLogger()
- {
- return _eventLogger;
}
@Override
@@ -99,11 +84,30 @@ public abstract class AbstractRuleBasedA
abstract protected RuleBasedAccessControl
createRuleBasedAccessController();
-
- @Override
- protected void onOpen()
+ @StateTransition(currentState = {State.UNINITIALIZED, State.QUIESCED,
State.ERRORED}, desiredState = State.ACTIVE)
+ @SuppressWarnings("unused")
+ private ListenableFuture<Void> activate()
{
- super.onOpen();
+
+ final boolean isManagementMode =
getModel().getAncestor(SystemConfig.class, this).isManagementMode();
+ try
+ {
+ recreateAccessController();
+ setState(isManagementMode ? State.QUIESCED : State.ACTIVE);
+ }
+ catch (RuntimeException e)
+ {
+ setState(State.ERRORED);
+ if (isManagementMode)
+ {
+ LOGGER.warn("Failed to activate ACL provider: " + getName(),
e);
+ }
+ else
+ {
+ throw e;
+ }
+ }
+ return Futures.immediateFuture(null);
}
@@ -112,46 +116,11 @@ public abstract class AbstractRuleBasedA
_accessControl = createRuleBasedAccessController();
}
- @Override
- protected void onClose()
- {
- super.onClose();
-
- }
-
- @StateTransition(currentState = State.UNINITIALIZED, desiredState =
State.QUIESCED)
- @SuppressWarnings("unused")
- private ListenableFuture<Void> startQuiesced()
- {
- setState(State.QUIESCED);
- return Futures.immediateFuture(null);
- }
- @StateTransition(currentState = {State.ACTIVE, State.QUIESCED,
State.ERRORED}, desiredState = State.DELETED)
- @SuppressWarnings("unused")
- private ListenableFuture<Void> doDelete()
- {
- return doAfterAlways(closeAsync(),
- new Runnable()
- {
- @Override
- public void run()
- {
- setState(State.DELETED);
- deleted();
-
_eventLogger.message(AccessControlMessages.DELETE(getName()));
- }
- });
- }
public final AccessControl getAccessControl()
{
return _accessControl;
}
- public final int getPriority()
- {
- return _priority;
- }
-
}
Modified:
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedAccessControlProviderImpl.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedAccessControlProviderImpl.java?rev=1752846&r1=1752845&r2=1752846&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedAccessControlProviderImpl.java
(original)
+++
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedAccessControlProviderImpl.java
Fri Jul 15 16:05:14 2016
@@ -20,244 +20,30 @@
*/
package org.apache.qpid.server.security.access.plugins;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.apache.qpid.server.model.AccessControlProvider;
import org.apache.qpid.server.model.Broker;
-import org.apache.qpid.server.model.Content;
-import org.apache.qpid.server.model.CustomRestHeaders;
-import org.apache.qpid.server.model.ManagedAttributeField;
import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
-import org.apache.qpid.server.model.RestContentHeader;
-import org.apache.qpid.server.model.State;
-import org.apache.qpid.server.model.StateTransition;
-import org.apache.qpid.server.security.Result;
-import org.apache.qpid.server.security.access.config.ObjectProperties;
-import org.apache.qpid.server.security.access.config.ObjectType;
-import org.apache.qpid.server.security.access.config.LegacyOperation;
-import org.apache.qpid.server.security.access.RuleOutcome;
-import org.apache.qpid.server.security.access.config.AclAction;
-import org.apache.qpid.server.security.access.config.AclFileParser;
-import org.apache.qpid.server.security.access.config.AclRulePredicates;
-import org.apache.qpid.server.security.access.config.Rule;
-import org.apache.qpid.server.security.access.config.RuleBasedAccessControl;
-import org.apache.qpid.server.security.access.config.RuleSet;
import org.apache.qpid.server.util.urlstreamhandler.data.Handler;
-public class RuleBasedAccessControlProviderImpl
- extends
AbstractRuleBasedAccessControlProvider<RuleBasedAccessControlProviderImpl>
+class RuleBasedAccessControlProviderImpl
+ extends
AbstractCommonRulesBasedAccessControlProvider<RuleBasedAccessControlProviderImpl,
Broker<?>, AccessControlProvider<?>>
implements
RuleBasedAccessControlProvider<RuleBasedAccessControlProviderImpl>
{
- private static final Logger LOGGER =
LoggerFactory.getLogger(RuleBasedAccessControlProviderImpl.class);
static
{
Handler.register();
}
- private final Broker _broker;
-
- @ManagedAttributeField
- private Result _defaultResult;
- @ManagedAttributeField
- private List<AclRule> _rules;
-
@ManagedObjectFactoryConstructor
public RuleBasedAccessControlProviderImpl(Map<String, Object> attributes,
Broker broker)
{
super(attributes, broker);
- _broker = broker;
- }
-
-
- @Override
- protected void changeAttributes(final Map<String, Object> attributes)
- {
- super.changeAttributes(attributes);
- if(attributes.containsKey(DEFAULT_RESULT) ||
attributes.containsKey(RULES))
- {
- recreateAccessController();
- }
- }
-
- @Override
- protected RuleBasedAccessControl createRuleBasedAccessController()
- {
- List<Rule> rules = new ArrayList<>();
- for(AclRule configuredRule : _rules)
- {
- rules.add(new Rule(configuredRule.getIdentity(),
- new AclAction(configuredRule.getOperation(),
- configuredRule.getObjectType(),
- new
AclRulePredicates(configuredRule.getAttributes())),
- configuredRule.getOutcome()));
- }
- return new RuleBasedAccessControl(new RuleSet(this, rules,
_defaultResult), getModel());
- }
-
- @Override
- public Result getDefaultResult()
- {
- return _defaultResult;
- }
-
- @Override
- public List<AclRule> getRules()
- {
- return _rules;
- }
-
- @StateTransition(currentState = {State.UNINITIALIZED, State.QUIESCED,
State.ERRORED}, desiredState = State.ACTIVE)
- @SuppressWarnings("unused")
- private ListenableFuture<Void> activate()
- {
-
- try
- {
- recreateAccessController();
- setState(_broker.isManagementMode() ? State.QUIESCED :
State.ACTIVE);
- }
- catch (RuntimeException e)
- {
- setState(State.ERRORED);
- if (_broker.isManagementMode())
- {
- LOGGER.warn("Failed to activate ACL provider: " + getName(),
e);
- }
- else
- {
- throw e;
- }
- }
- return Futures.immediateFuture(null);
}
- @Override
- public void loadFromFile(final String path)
- {
- RuleSet ruleSet = AclFileParser.parse(path, this);
- List<AclRule> aclRules = new ArrayList<>();
- for(Rule rule : ruleSet.getAllRules())
- {
- aclRules.add(new AclRuleImpl(rule));
- }
- Map<String,Object> attrs = new HashMap<>();
- attrs.put(DEFAULT_RESULT, ruleSet.getDefault());
- attrs.put(RULES, aclRules);
- setAttributes(attrs);
- }
-
- public static class AclRuleImpl implements AclRule
- {
- private final Rule _rule;
-
- AclRuleImpl(final Rule rule)
- {
- _rule = rule;
- }
-
- @Override
- public String getIdentity()
- {
- return _rule.getIdentity();
- }
-
- @Override
- public ObjectType getObjectType()
- {
- return _rule.getAction().getObjectType();
- }
-
- @Override
- public LegacyOperation getOperation()
- {
- return _rule.getAction().getOperation();
- }
-
- @Override
- public Map<ObjectProperties.Property, String> getAttributes()
- {
- return _rule.getAction().getProperties().asPropertyMap();
- }
-
- @Override
- public RuleOutcome getOutcome()
- {
- return _rule.getRuleOutcome();
- }
- }
-
- @Override
- public Content extractRules()
- {
- StringBuilder sb = new StringBuilder();
- for(AclRule rule : _rules)
- {
- sb.append("ACL ");
- sb.append(rule.getOutcome().name().replace('_','-'));
- sb.append(' ');
- sb.append(rule.getIdentity());
- sb.append(' ');
- sb.append(rule.getOperation().name());
- sb.append(' ');
- sb.append(rule.getObjectType().name());
- for(Map.Entry<ObjectProperties.Property,String> entry :
rule.getAttributes().entrySet())
- {
- sb.append(' ');
- sb.append(entry.getKey().getCanonicalName());
- sb.append(" = \"");
- sb.append(entry.getValue());
- sb.append("\"");
- }
- sb.append('\n');
- }
- return new StringContent(sb.toString());
- }
-
- private static class StringContent implements Content, CustomRestHeaders
- {
-
- private final String _content;
-
- public StringContent(final String content)
- {
- _content = content;
- }
-
- @Override
- public void write(final OutputStream outputStream) throws IOException
- {
- outputStream.write(_content.getBytes(StandardCharsets.UTF_8));
- }
-
- @RestContentHeader("Content-Type")
- public String getContentType()
- {
- return "text/plain";
- }
-
- @Override
- public void release()
- {
-
- }
- }
-
- public int compareTo(final AccessControlProvider o)
- {
- return ACCESS_CONTROL_POVIDER_COMPARATOR.compare(this, o);
- }
}
Modified:
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedVirtualHostAccessControlProviderImpl.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedVirtualHostAccessControlProviderImpl.java?rev=1752846&r1=1752845&r2=1752846&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedVirtualHostAccessControlProviderImpl.java
(original)
+++
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/RuleBasedVirtualHostAccessControlProviderImpl.java
Fri Jul 15 16:05:14 2016
@@ -20,48 +20,19 @@
*/
package org.apache.qpid.server.security.access.plugins;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.Set;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.server.model.Broker;
import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.Content;
-import org.apache.qpid.server.model.CustomRestHeaders;
-import org.apache.qpid.server.model.ManagedAttributeField;
import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
-import org.apache.qpid.server.model.RestContentHeader;
-import org.apache.qpid.server.model.State;
-import org.apache.qpid.server.model.StateTransition;
-import org.apache.qpid.server.model.SystemConfig;
import org.apache.qpid.server.model.VirtualHost;
import org.apache.qpid.server.model.VirtualHostAccessControlProvider;
-import org.apache.qpid.server.security.Result;
-import org.apache.qpid.server.security.access.RuleOutcome;
-import org.apache.qpid.server.security.access.config.AclAction;
-import org.apache.qpid.server.security.access.config.AclFileParser;
-import org.apache.qpid.server.security.access.config.AclRulePredicates;
-import org.apache.qpid.server.security.access.config.LegacyOperation;
-import org.apache.qpid.server.security.access.config.ObjectProperties;
import org.apache.qpid.server.security.access.config.ObjectType;
-import org.apache.qpid.server.security.access.config.Rule;
-import org.apache.qpid.server.security.access.config.RuleBasedAccessControl;
-import org.apache.qpid.server.security.access.config.RuleSet;
import org.apache.qpid.server.util.urlstreamhandler.data.Handler;
public class RuleBasedVirtualHostAccessControlProviderImpl
- extends
AbstractRuleBasedAccessControlProvider<RuleBasedVirtualHostAccessControlProviderImpl>
+ extends
AbstractCommonRulesBasedAccessControlProvider<RuleBasedVirtualHostAccessControlProviderImpl,
VirtualHost<?>, VirtualHostAccessControlProvider<?>>
implements
RuleBasedVirtualHostAccessControlProvider<RuleBasedVirtualHostAccessControlProviderImpl>
{
private static final EnumSet<ObjectType> ALLOWED_OBJECT_TYPES =
EnumSet.of(ObjectType.ALL,
@@ -70,17 +41,11 @@ public class RuleBasedVirtualHostAccessC
ObjectType.VIRTUALHOST,
ObjectType.METHOD);
- private static final Logger LOGGER =
LoggerFactory.getLogger(RuleBasedVirtualHostAccessControlProviderImpl.class);
-
static
{
Handler.register();
}
- @ManagedAttributeField
- private Result _defaultResult;
- @ManagedAttributeField
- private List<AclRule> _rules;
@ManagedObjectFactoryConstructor
@@ -91,16 +56,6 @@ public class RuleBasedVirtualHostAccessC
@Override
- protected void changeAttributes(final Map<String, Object> attributes)
- {
- super.changeAttributes(attributes);
- if(attributes.containsKey(DEFAULT_RESULT) ||
attributes.containsKey(RULES))
- {
- recreateAccessController();
- }
- }
-
- @Override
protected void validateChange(final ConfiguredObject<?>
proxyForValidation, final Set<String> changedAttributes)
{
super.validateChange(proxyForValidation, changedAttributes);
@@ -116,174 +71,5 @@ public class RuleBasedVirtualHostAccessC
}
}
- @Override
- protected RuleBasedAccessControl createRuleBasedAccessController()
- {
- List<Rule> rules = new ArrayList<>();
- for(AclRule configuredRule : _rules)
- {
- rules.add(new Rule(configuredRule.getIdentity(),
- new AclAction(configuredRule.getOperation(),
- configuredRule.getObjectType(),
- new
AclRulePredicates(configuredRule.getAttributes())),
- configuredRule.getOutcome()));
- }
- return new RuleBasedAccessControl(new RuleSet(this, rules,
_defaultResult), getModel());
- }
-
- @Override
- public Result getDefaultResult()
- {
- return _defaultResult;
- }
-
- @Override
- public List<AclRule> getRules()
- {
- return _rules;
- }
-
- @StateTransition(currentState = {State.UNINITIALIZED, State.QUIESCED,
State.ERRORED}, desiredState = State.ACTIVE)
- @SuppressWarnings("unused")
- private ListenableFuture<Void> activate()
- {
-
- final boolean isManagementMode =
getModel().getAncestor(SystemConfig.class, this).isManagementMode();
- try
- {
- recreateAccessController();
- setState(isManagementMode ? State.QUIESCED : State.ACTIVE);
- }
- catch (RuntimeException e)
- {
- setState(State.ERRORED);
- if (isManagementMode)
- {
- LOGGER.warn("Failed to activate ACL provider: " + getName(),
e);
- }
- else
- {
- throw e;
- }
- }
- return Futures.immediateFuture(null);
- }
-
- @Override
- public void loadFromFile(final String path)
- {
- RuleSet ruleSet = AclFileParser.parse(path, this);
- List<AclRule> aclRules = new ArrayList<>();
- for(Rule rule : ruleSet.getAllRules())
- {
- aclRules.add(new AclRuleImpl(rule));
- }
- Map<String,Object> attrs = new HashMap<>();
- attrs.put(DEFAULT_RESULT, ruleSet.getDefault());
- attrs.put(RULES, aclRules);
- setAttributes(attrs);
- }
-
- @Override
- public int compareTo(final VirtualHostAccessControlProvider o)
- {
- return VIRTUAL_HOST_ACCESS_CONTROL_POVIDER_COMPARATOR.compare(this, o);
- }
-
- public static class AclRuleImpl implements AclRule
- {
- private final Rule _rule;
-
- AclRuleImpl(final Rule rule)
- {
- _rule = rule;
- }
-
- @Override
- public String getIdentity()
- {
- return _rule.getIdentity();
- }
-
- @Override
- public ObjectType getObjectType()
- {
- return _rule.getAction().getObjectType();
- }
-
- @Override
- public LegacyOperation getOperation()
- {
- return _rule.getAction().getOperation();
- }
-
- @Override
- public Map<ObjectProperties.Property, String> getAttributes()
- {
- return _rule.getAction().getProperties().asPropertyMap();
- }
-
- @Override
- public RuleOutcome getOutcome()
- {
- return _rule.getRuleOutcome();
- }
- }
-
- @Override
- public Content extractRules()
- {
- StringBuilder sb = new StringBuilder();
- for(AclRule rule : _rules)
- {
- sb.append("ACL ");
- sb.append(rule.getOutcome().name().replace('_','-'));
- sb.append(' ');
- sb.append(rule.getIdentity());
- sb.append(' ');
- sb.append(rule.getOperation().name());
- sb.append(' ');
- sb.append(rule.getObjectType().name());
- for(Map.Entry<ObjectProperties.Property,String> entry :
rule.getAttributes().entrySet())
- {
- sb.append(' ');
- sb.append(entry.getKey().getCanonicalName());
- sb.append(" = \"");
- sb.append(entry.getValue());
- sb.append("\"");
- }
- sb.append('\n');
- }
- return new StringContent(sb.toString());
- }
-
- private static class StringContent implements Content, CustomRestHeaders
- {
-
- private final String _content;
-
- public StringContent(final String content)
- {
- _content = content;
- }
-
- @Override
- public void write(final OutputStream outputStream) throws IOException
- {
- outputStream.write(_content.getBytes(StandardCharsets.UTF_8));
- }
-
- @RestContentHeader("Content-Type")
- public String getContentType()
- {
- return "text/plain";
- }
-
- @Override
- public void release()
- {
-
- }
- }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]