001package com.box.sdk;
002
003import com.eclipsesource.json.JsonObject;
004import com.eclipsesource.json.JsonValue;
005import java.util.Date;
006
007/**
008 * The abstract base class for types that can be added to collaborations.
009 */
010public abstract class BoxCollaborator extends BoxResource {
011
012    /**
013     * Constructs a BoxCollaborator for a collaborator with a given ID.
014     *
015     * @param api the API connection to be used by the collaborator.
016     * @param id  the ID of the collaborator.
017     */
018    public BoxCollaborator(BoxAPIConnection api, String id) {
019        super(api, id);
020    }
021
022    /**
023     * Enumerates the possible types of collaborations.
024     */
025    public enum CollaboratorType {
026        /**
027         * A user.
028         */
029        USER("user"),
030
031        /**
032         * A group.
033         */
034        GROUP("group");
035
036        private final String jsonValue;
037
038        CollaboratorType(String jsonValue) {
039            this.jsonValue = jsonValue;
040        }
041
042        static CollaboratorType fromJSONValue(String jsonValue) {
043            return CollaboratorType.valueOf(jsonValue.toUpperCase());
044        }
045
046        String toJSONValue() {
047            return this.jsonValue;
048        }
049    }
050
051    /**
052     * Enumerates the possible types of groups.
053     */
054    public enum GroupType {
055        /**
056         * A users group.
057         */
058        ALL_USERS_GROUP("all_users_group"),
059
060        /**
061         * A managed group.
062         */
063        MANAGED_GROUP("managed_group");
064
065        private final String jsonValue;
066
067        GroupType(String jsonValue) {
068            this.jsonValue = jsonValue;
069        }
070
071        static GroupType fromJSONValue(String jsonValue) {
072            return GroupType.valueOf(jsonValue.toUpperCase());
073        }
074
075        String toJSONValue() {
076            return this.jsonValue;
077        }
078    }
079
080    /**
081     * Contains information about a BoxCollaborator.
082     */
083    public abstract class Info extends BoxResource.Info {
084        private CollaboratorType type;
085        private String name;
086        private Date createdAt;
087        private Date modifiedAt;
088        private String login;
089        private GroupType groupType;
090
091        /**
092         * Constructs an empty Info object.
093         */
094        public Info() {
095            super();
096        }
097
098        /**
099         * Constructs an Info object by parsing information from a JSON string.
100         *
101         * @param json the JSON string to parse.
102         */
103        public Info(String json) {
104            super(json);
105        }
106
107        /**
108         * Constructs an Info object using an already parsed JSON object.
109         *
110         * @param jsonObject the parsed JSON object.
111         */
112        Info(JsonObject jsonObject) {
113            super(jsonObject);
114        }
115
116        /**
117         * Gets the type of the collaborator.
118         *
119         * @return the type of the collaborator.
120         */
121        public CollaboratorType getType() {
122            return this.type;
123        }
124
125        /**
126         * Gets the name of the collaborator.
127         *
128         * @return the name of the collaborator.
129         */
130        public String getName() {
131            return this.name;
132        }
133
134        /**
135         * Sets the name of the collaborator.
136         *
137         * @param name the new name of the collaborator.
138         */
139        public void setName(String name) {
140            this.name = name;
141            this.addPendingChange("name", name);
142        }
143
144        /**
145         * Gets the date that the collaborator was created.
146         *
147         * @return the date that the collaborator was created.
148         */
149        public Date getCreatedAt() {
150            return this.createdAt;
151        }
152
153        /**
154         * Gets the date that the collaborator was modified.
155         *
156         * @return the date that the collaborator was modified.
157         */
158        public Date getModifiedAt() {
159            return this.modifiedAt;
160        }
161
162        /**
163         * Gets the login for the collaborator if the collaborator is a user.
164         *
165         * @return the login of the collaboraor.
166         */
167        public String getLogin() {
168            return this.login;
169        }
170
171        /**
172         * Gets the group type for the collaborator if the collaborator is a group.
173         *
174         * @return the group type of the collaboraor.
175         */
176        public GroupType getGroupType() {
177            return this.groupType;
178        }
179
180        @Override
181        protected void parseJSONMember(JsonObject.Member member) {
182            super.parseJSONMember(member);
183            JsonValue value = member.getValue();
184            String name = member.getName();
185
186            try {
187
188                switch (name) {
189                    case "type":
190                        this.type = CollaboratorType.fromJSONValue(value.asString());
191                        break;
192                    case "name":
193                        this.name = value.asString();
194                        break;
195                    case "created_at":
196                        this.createdAt = BoxDateFormat.parse(value.asString());
197                        break;
198                    case "modified_at":
199                        this.modifiedAt = BoxDateFormat.parse(value.asString());
200                        break;
201                    case "login":
202                        this.login = value.asString();
203                        break;
204                    case "group_type":
205                        this.groupType = GroupType.fromJSONValue(value.asString());
206                        break;
207                    default:
208                        break;
209                }
210            } catch (Exception e) {
211                throw new BoxDeserializationException(name, value.toString(), e);
212            }
213        }
214    }
215}