Java tutorial
/** * Copyright 2014 Kakao Corp. * * Redistribution and modification in source or binary forms are not permitted without specific prior written permission. * * 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 com.kakao; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.json.JSONArray; import org.json.JSONException; import com.kakao.internal.Action; import com.kakao.internal.KakaoTalkLinkProtocol; import com.kakao.internal.LinkObject; /** * ? Builder?. * ? ? ? content . */ public class KakaoTalkLinkMessageBuilder { private final String appKey; private final String appVer; private final AtomicInteger textType; private final AtomicInteger imageType; private final AtomicInteger buttonType; private final AtomicInteger linkType; private final List<LinkObject> linkObjList; KakaoTalkLinkMessageBuilder(final String appKey, final String appVer) { this.appKey = appKey; this.appVer = appVer; this.textType = new AtomicInteger(0); this.imageType = new AtomicInteger(0); this.buttonType = new AtomicInteger(0); this.linkType = new AtomicInteger(0); this.linkObjList = new ArrayList<LinkObject>(); } /** * ? . ? ? 1000? ?. * * @param text * @throws KakaoParameterException ? ? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addText(final String text) throws KakaoParameterException { if (textType.getAndIncrement() == 1) throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.DUPLICATE_OBJECTS_USED, "textType already added. each type can be added once, at most."); final LinkObject textLink = LinkObject.newText(text); linkObjList.add(textLink); return this; } /** * ? ? . 70px * 70px ? ? ? , ? 500kb ? ? ? ?? ? ? url? ?? . * * @param src ? ?? url * @param width ?? ? * @param height ?? ? * @throws KakaoParameterException ? ? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addImage(final String src, final int width, final int height) throws KakaoParameterException { if (imageType.getAndIncrement() == 1) throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.DUPLICATE_OBJECTS_USED, "imageType already added. each type can be added once, at most."); final LinkObject imageLink = LinkObject.newImage(src, width, height); linkObjList.add(imageLink); return this; } /** * ? ? . * ? kakao[appkey]://kakaolink ??. * ? url? append parameter {@link #addAppButton(String, com.kakao.internal.Action)}? . * @param text ? ? ? * @throws KakaoParameterException ? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addAppButton(final String text) throws KakaoParameterException { addAppButton(text, Action.newActionApp(null)); return this; } /** * ? ? . * ? url? append parameter . * ? kakao[appkey]://akaolink ?? {@link #addAppButton(String)} . * @param text ? ? ? * @param appAction app url? append parameter os, device * @throws KakaoParameterException ? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addAppButton(final String text, final Action appAction) throws KakaoParameterException { if (buttonType.getAndIncrement() == 1) throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.DUPLICATE_OBJECTS_USED, "buttonType already added. each type can be added once, at most."); final LinkObject appButton = LinkObject.newButton(text, appAction); linkObjList.add(appButton); return this; } /** * ? ? ? ?? ? ? . * ? ? ??? path, parameter? ? url ? {@link #addWebButton(String, String)}? . * @param text ? ? ? * @throws KakaoParameterException ? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addWebButton(final String text) throws KakaoParameterException { addWebButton(text, null); return this; } /** * [private] ? ?. {@link #addWebButton(String)} ? ? inweb view ? . * ? ? ? ?? ? ? . * ? ? ??? path, parameter? ? url ? {@link #addInWebButton(String, String)}? . * @param text ? ? ? * @throws KakaoParameterException ? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addInWebButton(final String text) throws KakaoParameterException { addWebButton(text, null); return this; } /** * ? ? ? . * ? ? ? ?? ? {@link #addWebButton(String)}? . * @param text ? ? ? * @param url ? ? ??? path, parameter? ? url * @throws KakaoParameterException ? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addWebButton(final String text, final String url) throws KakaoParameterException { if (buttonType.getAndIncrement() == 1) throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.DUPLICATE_OBJECTS_USED, "buttonType already added. each type can be added once, at most."); final Action webAction = Action.newActionWeb(url); final LinkObject webButton = LinkObject.newButton(text, webAction); linkObjList.add(webButton); return this; } /** * [private] ? ?. {@link #addWebButton(String, String)} ? ? inweb view ? . * ? ? ? . * ? ? ? ?? ? {@link #addInWebButton(String)}? . * @param text ? ? ? * @param url ? ? ??? path, parameter? ? url * @throws KakaoParameterException ? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addInWebButton(final String text, final String url) throws KakaoParameterException { if (buttonType.getAndIncrement() == 1) throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.DUPLICATE_OBJECTS_USED, "buttonType already added. each type can be added once, at most."); final Action webAction = Action.newActionInWeb(url); final LinkObject webButton = LinkObject.newButton(text, webAction); linkObjList.add(webButton); return this; } /** * ?? ? . * ?? ? kakao[appkey]://exec ??. * url? append parameter {@link #addAppLink(String, com.kakao.internal.Action)} . * @param text ??? ? * @throws KakaoParameterException ? ?? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addAppLink(final String text) throws KakaoParameterException { addAppLink(text, Action.newActionApp(null)); return this; } /** * ?? ? . * ?? ? url? append parameter . * ?? ? kakao[appkey]://exec ?? {@link #addAppLink(String)} . * @param text ??? ? * @param appAction url? append parameter os, device * @throws KakaoParameterException ? ?? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addAppLink(final String text, final Action appAction) throws KakaoParameterException { if (linkType.getAndIncrement() == 1) throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.DUPLICATE_OBJECTS_USED, "linkType already added. each type can be added once, at most."); final LinkObject appLink = LinkObject.newLink(text, appAction); linkObjList.add(appLink); return this; } /** * ? ? ? ?? ?? ? . * ? ? ??? path, parameter? ? url ??? {@link #addWebLink(String, String)}? . * @param text ??? ? * @throws KakaoParameterException ? ?? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addWebLink(final String text) throws KakaoParameterException { addWebLink(text, null); return this; } /** * [private] ? ?. {@link #addWebLink(String)} ?? ? ? inweb view ? . * ? ? ? ?? ?? ? . * ? ? ??? path, parameter? ? url ??? {@link #addInWebLink(String, String)}? . * @param text ??? ? * @throws KakaoParameterException ? ?? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addInWebLink(final String text) throws KakaoParameterException { addWebLink(text, null); return this; } /** * ? ?? ? . * ? ? ? ?? ??? {@link #addWebLink(String)}? . * @param text ??? ? * @param url ? ? ??? path, parameter? ? url * @throws KakaoParameterException ? ?? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addWebLink(final String text, final String url) throws KakaoParameterException { if (linkType.getAndIncrement() == 1) throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.DUPLICATE_OBJECTS_USED, "linkType already added. each type can be added once, at most."); final Action webAction = Action.newActionWeb(url); final LinkObject webLink = LinkObject.newLink(text, webAction); linkObjList.add(webLink); return this; } /** * [private] ? ?. {@link #addWebLink(String, String)} ?? ? ? inweb view ? . * ? ?? ? . * ? ? ? ?? ??? {@link #addInWebLink(String)}? . * @param text ??? ? * @param url ? ? ??? path, parameter? ? url * @throws KakaoParameterException ? ?? ?? ?? ?. */ public KakaoTalkLinkMessageBuilder addInWebLink(final String text, final String url) throws KakaoParameterException { if (linkType.getAndIncrement() == 1) throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.DUPLICATE_OBJECTS_USED, "linkType already added. each type can be added once, at most."); final Action webAction = Action.newActionInWeb(url); final LinkObject webLink = LinkObject.newLink(text, webAction); linkObjList.add(webLink); return this; } /** * ? ? ? . * @return ? * @throws KakaoParameterException ? ?. */ public String build() throws KakaoParameterException { try { if (linkObjList.isEmpty()) throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.CORE_PARAMETER_MISSING, "call addAppLink or addWebLink or addAppButton or addWebButton or addText or addImage before calling build()."); final StringBuilder talkLinkURL = new StringBuilder(KakaoTalkLinkProtocol.KAKAO_TALK_LINK_URL) .append("?"); talkLinkURL.append(KakaoTalkLinkProtocol.LINK_VER).append("=") .append(URLEncoder.encode(KakaoTalkLinkProtocol.LINK_VERSION, KakaoTalkLinkProtocol.ENCODING)) .append("&"); talkLinkURL.append(KakaoTalkLinkProtocol.API_VER).append("=") .append(URLEncoder.encode(KakaoTalkLinkProtocol.API_VERSION, KakaoTalkLinkProtocol.ENCODING)) .append("&"); talkLinkURL.append(KakaoTalkLinkProtocol.APP_KEY).append("=") .append(URLEncoder.encode(appKey, KakaoTalkLinkProtocol.ENCODING)).append("&"); talkLinkURL.append(KakaoTalkLinkProtocol.APP_VER).append("=") .append(URLEncoder.encode(appVer, KakaoTalkLinkProtocol.ENCODING)).append("&"); talkLinkURL.append(KakaoTalkLinkProtocol.OBJS).append("="); final JSONArray jsonArray = new JSONArray(); for (LinkObject linkObject : linkObjList) { jsonArray.put(linkObject.createJSONObject()); } final String encodedValue = URLEncoder.encode(jsonArray.toString(), KakaoTalkLinkProtocol.ENCODING); return talkLinkURL.append(encodedValue).toString(); } catch (UnsupportedEncodingException e) { throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.UNSUPPORTED_ENCODING, e); } catch (JSONException e) { throw new KakaoParameterException(KakaoParameterException.ERROR_CODE.JSON_PARSING_ERROR, e); } } }