/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* 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 jetbrains.buildServer.server.rest.jersey;
import com.sun.jersey.api.json.JSONConfiguration;
import com.sun.jersey.api.json.JSONJAXBContext;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import jetbrains.buildServer.server.rest.model.Comment;
import jetbrains.buildServer.server.rest.model.agent.Agent;
import jetbrains.buildServer.server.rest.model.agent.Agents;
import jetbrains.buildServer.server.rest.model.build.*;
import jetbrains.buildServer.server.rest.model.buildType.*;
import jetbrains.buildServer.server.rest.model.change.*;
import jetbrains.buildServer.server.rest.model.group.Group;
import jetbrains.buildServer.server.rest.model.group.Groups;
import jetbrains.buildServer.server.rest.model.issue.Issue;
import jetbrains.buildServer.server.rest.model.issue.IssueUsage;
import jetbrains.buildServer.server.rest.model.issue.IssueUsages;
import jetbrains.buildServer.server.rest.model.issue.Issues;
import jetbrains.buildServer.server.rest.model.plugin.PluginInfo;
import jetbrains.buildServer.server.rest.model.plugin.PluginInfos;
import jetbrains.buildServer.server.rest.model.project.NewProjectDescription;
import jetbrains.buildServer.server.rest.model.project.Project;
import jetbrains.buildServer.server.rest.model.project.Projects;
import jetbrains.buildServer.server.rest.model.server.Server;
import jetbrains.buildServer.server.rest.model.user.User;
import jetbrains.buildServer.server.rest.model.user.Users;
import jetbrains.buildServer.util.FuncThrow;
/**
* User: Yegor Yarko
* Date: 29.03.2009
*/
@Provider
//todo: add to spring to make it work:
public class JAXBContextResolver implements ContextResolver {
private JAXBContext context;
private Set types;
//Root entities should be listed here
private final Class[] cTypes = {
Agent.class, Agents.class,
Build.class, Builds.class,
BuildsList.class,
BuildType.class, BuildTypes.class,
Branch.class, Branches.class,
PropEntity.class, PropEntityFeature.class, PropEntityStep.class, PropEntityAgentRequirement.class, PropEntityTrigger.class, PropEntitySnapshotDep.class, PropEntityArtifactDep.class,
PropEntitiesFeature.class, PropEntitiesStep.class, PropEntitiesAgentRequirement.class, PropEntitiesTrigger.class, PropEntitiesSnapshotDep.class, PropEntitiesArtifactDep.class,
Change.class, Changes.class, FileChange.class, Revision.class, Revisions.class,
VcsRoot.class, VcsRoots.class, VcsRootEntry.class, VcsRootEntries.class, VcsRootInstance.class, VcsRootInstances.class, VcsRootRef.class, VcsRootInstanceRef.class,
Group.class, Groups.class,
Issue.class, Issues.class, IssueUsage.class, IssueUsages.class,
Investigation.class, Investigations.class, InvestigationScope.class,
Comment.class,
PluginInfo.class, PluginInfos.class,
Project.class, Projects.class,
Server.class,
User.class, Users.class,
NewBuildTypeDescription.class, NewProjectDescription.class,
jetbrains.buildServer.server.restcontrib.cctray.model.Project.class, jetbrains.buildServer.server.restcontrib.cctray.model.Projects.class,
};
public JAXBContextResolver() throws Exception {
// necessary until http://youtrack.jetbrains.net/issue/TW-10204 is fixed
jetbrains.buildServer.util.Util.doUnderContextClassLoader(getClass().getClassLoader(), new FuncThrow() {
public Void apply() throws JAXBException {
types = new HashSet(Arrays.asList(cTypes));
context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes);
return null;
}
});
}
public JAXBContext getContext(Class> objectType) {
// return context; // this would make request fail if the served or posted root bean is not accessible from cTypes
// returning the context for all "our" types
final String name = objectType.getName();
return name.startsWith("jetbrains.buildServer.server.rest") || name.startsWith("jetbrains.buildServer.server.restcontrib")? context : null;
}
}