001 /*
002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org
003 * Copyright (C) 2011 NightLabs Consulting GmbH
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program. If not, see <http://www.gnu.org/licenses/>.
017 */
018 package org.cumulus4j.keymanager.back.shared;
019
020 import java.util.Arrays;
021 import java.util.Collections;
022 import java.util.HashSet;
023 import java.util.Set;
024
025 import javax.ws.rs.ext.ContextResolver;
026 import javax.ws.rs.ext.Provider;
027 import javax.xml.bind.JAXBContext;
028
029 import org.slf4j.Logger;
030 import org.slf4j.LoggerFactory;
031
032 /**
033 * {@link ContextResolver} implementation telling JAXB all DTO classes that are required for
034 * the communication channel between app-server and key-manager.
035 *
036 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
037 */
038 @Provider
039 public final class JAXBContextResolver implements ContextResolver<JAXBContext>
040 {
041 private static final Logger logger = LoggerFactory.getLogger(JAXBContextResolver.class);
042
043 private final JAXBContext context;
044
045 private static final Class<?>[] cTypes = {
046 ErrorResponse.class,
047 GetActiveEncryptionKeyRequest.class,
048 GetActiveEncryptionKeyResponse.class,
049 GetKeyRequest.class,
050 GetKeyResponse.class,
051 NullResponse.class,
052 Request.class,
053 Response.class,
054 Message.class
055 };
056
057 private static final Set<Class<?>> types = Collections.unmodifiableSet(new HashSet<Class<?>>(Arrays.asList(cTypes)));
058
059 /**
060 * Create a new instance of <code>JAXBContextResolver</code>. This is called by Jersey (the class is passed to it).
061 * @throws Exception in case creation of this resolver fails.
062 */
063 public JAXBContextResolver() throws Exception {
064 logger.debug("Instantiating JAXBContextResolver.");
065 this.context = JAXBContext.newInstance(cTypes);
066 }
067
068 @Override
069 public JAXBContext getContext(Class<?> objectType) {
070 JAXBContext result = (types.contains(objectType)) ? context : null;
071 logger.debug(
072 "getContext: objectType={} matching={}",
073 (objectType == null ? null : objectType.getName()),
074 result != null
075 );
076 return result;
077 }
078 }