package com.sun.identity.saml2.protocol;

import com.sun.identity.saml2.common.SAML2Exception;
import com.sun.identity.saml2.common.SAML2SDKUtils;
import com.sun.identity.saml2.protocol.impl.ArtifactImpl;
import com.sun.identity.saml2.protocol.impl.ArtifactResolveImpl;
import com.sun.identity.saml2.protocol.impl.ArtifactResponseImpl;
import com.sun.identity.saml2.protocol.impl.AuthnRequestImpl;
import com.sun.identity.saml2.protocol.impl.ExtensionsImpl;
import com.sun.identity.saml2.protocol.impl.GetCompleteImpl;
import com.sun.identity.saml2.protocol.impl.IDPEntryImpl;
import com.sun.identity.saml2.protocol.impl.IDPListImpl;
import com.sun.identity.saml2.protocol.impl.LogoutRequestImpl;
import com.sun.identity.saml2.protocol.impl.LogoutResponseImpl;
import com.sun.identity.saml2.protocol.impl.NameIDPolicyImpl;
import com.sun.identity.saml2.protocol.impl.NewEncryptedIDImpl;
import com.sun.identity.saml2.protocol.impl.NewIDImpl;
import com.sun.identity.saml2.protocol.impl.RequestedAuthnContextImpl;
import com.sun.identity.saml2.protocol.impl.RequesterIDImpl;
import com.sun.identity.saml2.protocol.impl.ResponseImpl;
import com.sun.identity.saml2.protocol.impl.ScopingImpl;
import com.sun.identity.saml2.protocol.impl.SessionIndexImpl;
import com.sun.identity.saml2.protocol.impl.StatusCodeImpl;
import com.sun.identity.saml2.protocol.impl.StatusDetailImpl;
import com.sun.identity.saml2.protocol.impl.StatusImpl;
import com.sun.identity.saml2.protocol.impl.StatusMessageImpl;
import org.w3c.dom.Element;

public class ProtocolFactory {
   private static final ProtocolFactory PROTO_INSTANCE = new ProtocolFactory();

   private ProtocolFactory() {
   }

   public static ProtocolFactory getInstance() {
      return PROTO_INSTANCE;
   }

   public AuthnRequest createAuthnRequest() {
      Object obj = SAML2SDKUtils.getObjectInstance("AuthnRequest");
      return obj == null ? new AuthnRequestImpl() : (AuthnRequest)obj;
   }

   public AuthnRequest createAuthnRequest(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("AuthnRequest", value);
      return obj == null ? new AuthnRequestImpl(value) : (AuthnRequest)obj;
   }

   public AuthnRequest createAuthnRequest(String value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("AuthnRequest", value);
      return obj == null ? new AuthnRequestImpl(value) : (AuthnRequest)obj;
   }

   public Extensions createExtensions() throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Extensions");
      return obj == null ? new ExtensionsImpl() : (Extensions)obj;
   }

   public Extensions createExtensions(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Extensions", value);
      return obj == null ? new ExtensionsImpl(value) : (Extensions)obj;
   }

   public GetComplete createGetComplete(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("GetComplete", value);
      return obj == null ? new GetCompleteImpl(value) : (GetComplete)obj;
   }

   public IDPEntry createIDPEntry(String value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("IDPEntry", value);
      return obj == null ? new IDPEntryImpl(value) : (IDPEntry)obj;
   }

   public IDPList createIDPList(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("IDPList", value);
      return obj == null ? new IDPListImpl(value) : (IDPList)obj;
   }

   public NameIDPolicy createNameIDPolicy() {
      Object obj = SAML2SDKUtils.getObjectInstance("NameIDPolicy");
      return obj == null ? new NameIDPolicyImpl() : (NameIDPolicy)obj;
   }

   public NameIDPolicy createNameIDPolicy(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("NameIDPolicy", value);
      return obj == null ? new NameIDPolicyImpl(value) : (NameIDPolicy)obj;
   }

   public RequesterID createRequesterID(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("RequesterID", value);
      return obj == null ? new RequesterIDImpl(value) : (RequesterID)obj;
   }

   public Scoping createScoping(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Scoping", value);
      return obj == null ? new ScopingImpl(value) : (Scoping)obj;
   }

   public RequestedAuthnContext createRequestedAuthnContext() {
      Object obj = SAML2SDKUtils.getObjectInstance("RequestedAuthnContext");
      return obj == null ? new RequestedAuthnContextImpl() : (RequestedAuthnContext)obj;
   }

   public RequestedAuthnContext createRequestedAuthnContext(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("RequestedAuthnContext", value);
      return obj == null ? new RequestedAuthnContextImpl(value) : (RequestedAuthnContext)obj;
   }

   public NewID createNewID(Element value) {
      Object obj = SAML2SDKUtils.getObjectInstance("NewID", value);
      return obj == null ? new NewIDImpl(value) : (NewID)obj;
   }

   public NewEncryptedID createNewEncryptedID(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("NewEncryptedID", value);
      return obj == null ? new NewEncryptedIDImpl(value) : (NewEncryptedID)obj;
   }

   public LogoutRequest createLogoutRequest() {
      Object obj = SAML2SDKUtils.getObjectInstance("LogoutRequest");
      return obj == null ? new LogoutRequestImpl() : (LogoutRequest)obj;
   }

   public LogoutRequest createLogoutRequest(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("LogoutRequest", value);
      return obj == null ? new LogoutRequestImpl(value) : (LogoutRequest)obj;
   }

   public LogoutRequest createLogoutRequest(String value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("LogoutRequest", value);
      return obj == null ? new LogoutRequestImpl(value) : (LogoutRequest)obj;
   }

   public LogoutResponse createLogoutResponse() {
      Object obj = SAML2SDKUtils.getObjectInstance("LogoutResponse");
      return obj == null ? new LogoutResponseImpl() : (LogoutResponse)obj;
   }

   public LogoutResponse createLogoutResponse(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("LogoutResponse", value);
      return obj == null ? new LogoutResponseImpl(value) : (LogoutResponse)obj;
   }

   public LogoutResponse createLogoutResponse(String value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("LogoutResponse", value);
      return obj == null ? new LogoutResponseImpl(value) : (LogoutResponse)obj;
   }

   public Status createStatus() throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Status");
      return obj == null ? new StatusImpl() : (Status)obj;
   }

   public Status createStatus(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Status", value);
      return obj == null ? new StatusImpl(value) : (Status)obj;
   }

   public StatusCode createStatusCode() throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("StatusCode");
      return obj == null ? new StatusCodeImpl() : (StatusCode)obj;
   }

   public StatusCode createStatusCode(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("StatusCode", value);
      return obj == null ? new StatusCodeImpl(value) : (StatusCode)obj;
   }

   public StatusDetail createStatusDetail() throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("StatusDetail");
      return obj == null ? new StatusDetailImpl() : (StatusDetail)obj;
   }

   public StatusDetail createStatusDetail(Element value) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("StatusDetail", value);
      return obj == null ? new StatusDetailImpl(value) : (StatusDetail)obj;
   }

   public StatusMessage createStatusMessage(String value) {
      Object obj = SAML2SDKUtils.getObjectInstance("StatusMessage", value);
      return obj == null ? new StatusMessageImpl(value) : (StatusMessage)obj;
   }

   public SessionIndex createSessionIndex(String value) {
      Object obj = SAML2SDKUtils.getObjectInstance("SessionIndex", value);
      return obj == null ? new SessionIndexImpl(value) : (SessionIndex)obj;
   }

   public Artifact createArtifact(byte[] typecode, int endpointIndex, String sourceID, String messageHandle) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Artifact", typecode, endpointIndex, sourceID, messageHandle);
      return obj == null ? new ArtifactImpl(typecode, endpointIndex, sourceID, messageHandle) : (Artifact)obj;
   }

   public Artifact createArtifact(Element elem) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Artifact", elem);
      return obj == null ? new ArtifactImpl(elem) : (Artifact)obj;
   }

   public Artifact createArtifact(String encodedArtifactValue) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Artifact", encodedArtifactValue);
      return obj == null ? new ArtifactImpl(encodedArtifactValue) : (Artifact)obj;
   }

   public ArtifactResolve createArtifactResolve() {
      Object obj = SAML2SDKUtils.getObjectInstance("ArtifactResolve");
      return obj == null ? new ArtifactResolveImpl() : (ArtifactResolve)obj;
   }

   public ArtifactResolve createArtifactResolve(Element elem) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("ArtifactResolve", elem);
      return obj == null ? new ArtifactResolveImpl(elem) : (ArtifactResolve)obj;
   }

   public ArtifactResponse createArtifactResponse() {
      Object obj = SAML2SDKUtils.getObjectInstance("ArtifactResponse");
      return obj == null ? new ArtifactResponseImpl() : (ArtifactResponse)obj;
   }

   public ArtifactResponse createArtifactResponse(Element elem) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("ArtifactResponse", elem);
      return obj == null ? new ArtifactResponseImpl(elem) : (ArtifactResponse)obj;
   }

   public Response createResponse() {
      Object obj = SAML2SDKUtils.getObjectInstance("Response");
      return obj == null ? new ResponseImpl() : (Response)obj;
   }

   public Response createResponse(Element elem) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Response", elem);
      return obj == null ? new ResponseImpl(elem) : (Response)obj;
   }

   public Response createResponse(String xml) throws SAML2Exception {
      Object obj = SAML2SDKUtils.getObjectInstance("Response", xml);
      return obj == null ? new ResponseImpl(xml) : (Response)obj;
   }
}
