001    /**
002     * Copyright 2005-2012 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.ksb.api.bus.support;
017    
018    import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter;
019    
020    import javax.xml.bind.annotation.XmlAccessType;
021    import javax.xml.bind.annotation.XmlAccessorType;
022    import javax.xml.bind.annotation.XmlElement;
023    import javax.xml.bind.annotation.XmlRootElement;
024    import javax.xml.bind.annotation.XmlType;
025    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
026    import java.util.Collections;
027    import java.util.HashMap;
028    import java.util.Map;
029    
030    @XmlRootElement(name = RestServiceConfiguration.Constants.ROOT_ELEMENT_NAME)
031    @XmlAccessorType(XmlAccessType.NONE)
032    @XmlType(name = RestServiceConfiguration.Constants.TYPE_NAME, propOrder = {
033                    RestServiceConfiguration.Elements.RESOURCE_CLASS,
034                    RestServiceConfiguration.Elements.RESOURCE_TO_CLASS_NAME_MAP
035    })
036    public final class RestServiceConfiguration extends AbstractServiceConfiguration {
037    
038            private static final long serialVersionUID = -4226512121638441108L;
039    
040            @XmlElement(name = Elements.RESOURCE_CLASS, required = false)
041            private final String resourceClass;
042            
043            @XmlJavaTypeAdapter(MapStringStringAdapter.class)
044            @XmlElement(name = Elements.RESOURCE_TO_CLASS_NAME_MAP, required = false)
045            private final Map<String, String> resourceToClassNameMap;
046            
047            /**
048         * Private constructor used only by JAXB.
049         */
050            private RestServiceConfiguration() {
051                    super();
052                    this.resourceClass = null;
053                    this.resourceToClassNameMap = null;
054            }
055            
056            private RestServiceConfiguration(Builder builder) {
057                    super(builder);
058                    this.resourceClass = builder.getResourceClass();
059                    if (builder.getResourceToClassNameMap() != null) {
060                            this.resourceToClassNameMap = new HashMap<String, String>(builder.getResourceToClassNameMap());
061                    } else {
062                            this.resourceToClassNameMap = Collections.emptyMap();
063                    }
064            }
065            
066            public static RestServiceConfiguration fromServiceDefinition(RestServiceDefinition restServiceDefinition) {
067                    return Builder.create(restServiceDefinition).build();
068            }
069                    
070            public String getResourceClass() {
071                    return this.resourceClass;
072            }
073            
074            /**
075             * Returns a map of resource names to resource classes.  Can be null if
076             * there are no mapped resources on this service configuration.
077             * 
078             * @return the resource to class name map, or null if no resources have
079             * been mapped
080             */
081            public Map<String, String> getResourceToClassNameMap() {
082                    return this.resourceToClassNameMap;
083            }
084            
085            /**
086             * @param className
087             * @return true if this service contains a resource for the given class name
088             */
089            public boolean hasClass(String className) {
090                    if (resourceToClassNameMap == null) {
091                            return false;
092                    }
093                    return resourceToClassNameMap.containsValue(className);
094            }
095            
096            public static final class Builder extends AbstractServiceConfiguration.Builder<RestServiceConfiguration> {
097    
098                    private static final long serialVersionUID = 4300659121377259098L;
099    
100                    private String resourceClass;
101                    private Map<String, String> resourceToClassNameMap;
102                                    
103                    public String getResourceClass() {
104                            return resourceClass;
105                    }
106    
107                    public void setResourceClass(String resourceClass) {
108                            this.resourceClass = resourceClass;
109                    }
110    
111                    public Map<String, String> getResourceToClassNameMap() {
112                            return resourceToClassNameMap;
113                    }
114    
115                    public void setResourceToClassNameMap(Map<String, String> resourceToClassNameMap) {
116                            this.resourceToClassNameMap = resourceToClassNameMap;
117                    }
118                    
119                    private Builder() {
120                    }
121                    
122                    public static Builder create() {
123                            return new Builder();
124                    }
125                    
126                    public static Builder create(RestServiceDefinition restServiceDefinition) {
127                            Builder builder = create();
128                            builder.copyServiceDefinitionProperties(restServiceDefinition);
129                            builder.setResourceClass(restServiceDefinition.getResourceClass());
130                            if (restServiceDefinition.getResourceToClassNameMap() != null) {
131                                    builder.setResourceToClassNameMap(restServiceDefinition.getResourceToClassNameMap());
132                            }
133                            return builder;
134                    }
135    
136                    @Override
137                    public RestServiceConfiguration build() {
138                            return new RestServiceConfiguration(this);
139                    }
140                    
141            }
142            
143            /**
144         * Defines some internal constants used on this class.
145         */
146        static class Constants {
147            final static String ROOT_ELEMENT_NAME = "restServiceConfiguration";
148            final static String TYPE_NAME = "RestServiceConfigurationType";
149        }
150    
151        /**
152         * A private class which exposes constants which define the XML element names to use
153         * when this object is marshalled to XML.
154         */
155         static class Elements {
156            protected final static String RESOURCE_CLASS = "resourceClass";
157            protected final static String RESOURCE_TO_CLASS_NAME_MAP = "resourceToClassNameMap";
158        }
159    
160            
161    }