/*
* 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.directory.scim.spec.protocol.data;

import jakarta.ws.rs.core.Response.Status;
import jakarta.xml.bind.annotation.adapters.XmlAdapter;

public class StatusAdapter extends XmlAdapter<String, Status> {

  @Override
  public Status unmarshal(String v) throws Exception {
    if (v == null) {
      return null;
    }

    for (Status status : Status.values()) {
      if (status.getStatusCode() == Integer.valueOf(v)) {
        return status;
      }
    }
    throw new EnumConstantNotPresentException(Status.class, v);
  }

  @Override
  public String marshal(Status v) throws Exception {
    if (v == null) {
      return null;
    }
    return Integer.toString(v.getStatusCode());
  }

}
