From d92153ae00381eb0b66b6913cc665ac6b7bc61fd Mon Sep 17 00:00:00 2001 From: Sean Owen Date: Wed, 26 Feb 2014 21:59:26 +0000 Subject: [PATCH] Remove deprecated glass-mirror --- README.md | 19 +- glass-mirror/.gitignore | 2 - glass-mirror/pom.xml | 125 ------------ .../google/zxing/client/glass/AuthUtil.java | 87 -------- .../zxing/client/glass/DecodeHelper.java | 115 ----------- .../client/glass/NewUserSetupServlet.java | 185 ------------------ .../client/glass/NotificationCallable.java | 118 ----------- .../client/glass/NotificationServlet.java | 78 -------- .../glass/mirror/GoogleAPIMirrorClient.java | 99 ---------- .../glass/mirror/MemoryMirrorClient.java | 93 --------- .../client/glass/mirror/MirrorClient.java | 56 ------ .../client/glass/store/MySQLDataStore.java | 67 ------- .../glass/store/MySQLDataStoreFactory.java | 32 --- .../src/main/resources/Strings.properties | 8 - glass-mirror/src/main/resources/test.jpg | Bin 51304 -> 0 bytes glass-mirror/src/main/webapp/WEB-INF/web.xml | 104 ---------- glass-mirror/src/main/webapp/error.jspx | 41 ---- glass-mirror/src/main/webapp/glass/index.jspx | 31 --- glass-mirror/src/main/webapp/glass/style.css | 3 - pom.xml | 4 - 20 files changed, 7 insertions(+), 1260 deletions(-) delete mode 100644 glass-mirror/.gitignore delete mode 100755 glass-mirror/pom.xml delete mode 100755 glass-mirror/src/main/java/com/google/zxing/client/glass/AuthUtil.java delete mode 100755 glass-mirror/src/main/java/com/google/zxing/client/glass/DecodeHelper.java delete mode 100755 glass-mirror/src/main/java/com/google/zxing/client/glass/NewUserSetupServlet.java delete mode 100755 glass-mirror/src/main/java/com/google/zxing/client/glass/NotificationCallable.java delete mode 100755 glass-mirror/src/main/java/com/google/zxing/client/glass/NotificationServlet.java delete mode 100755 glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/GoogleAPIMirrorClient.java delete mode 100755 glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/MemoryMirrorClient.java delete mode 100755 glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/MirrorClient.java delete mode 100644 glass-mirror/src/main/java/com/google/zxing/client/glass/store/MySQLDataStore.java delete mode 100755 glass-mirror/src/main/java/com/google/zxing/client/glass/store/MySQLDataStoreFactory.java delete mode 100755 glass-mirror/src/main/resources/Strings.properties delete mode 100755 glass-mirror/src/main/resources/test.jpg delete mode 100755 glass-mirror/src/main/webapp/WEB-INF/web.xml delete mode 100755 glass-mirror/src/main/webapp/error.jspx delete mode 100755 glass-mirror/src/main/webapp/glass/index.jspx delete mode 100755 glass-mirror/src/main/webapp/glass/style.css diff --git a/README.md b/README.md index 9b65d0ea8..566534e77 100644 --- a/README.md +++ b/README.md @@ -38,19 +38,13 @@ There are also additional modules which are contributed and/or intermittently ma | actionscript | partial port to Actionscript | jruby | JRuby wrapper -### Deprecated - -| Module | Description -| ------------ | ----------- -| glass-mirror | partial implementation for the Google Glass Mirror API - ### Available in previous releases | Module | Description | ------ | ----------- -| [cpp](https://github.com/zxing/zxing/tree/00f634024ceeee591f54e6984ea7dd666fab22ae/cpp) | C++ port +| [cpp](https://github.com/zxing/zxing/tree/00f634024ceeee591f54e6984ea7dd666fab22ae/cpp) | C++ port | [iphone](https://github.com/zxing/zxing/tree/00f634024ceeee591f54e6984ea7dd666fab22ae/iphone) | iPhone client -| [objc](https://github.com/zxing/zxing/tree/00f634024ceeee591f54e6984ea7dd666fab22ae/objc) | Objective C port +| [objc](https://github.com/zxing/zxing/tree/00f634024ceeee591f54e6984ea7dd666fab22ae/objc) | Objective C port ### Related third-party open source projects @@ -61,10 +55,11 @@ There are also additional modules which are contributed and/or intermittently ma ### Other third-party open source projects -| Module | Description -| --------------------------------------------- | ----------- -| [ZBar](http://zbar.sourceforge.net/) | Decoder in C++, especially for iPhone -| [Zint](http://sourceforge.net/projects/zint/) | Barcode generator +| Module | Description +| ---------------------------------------------- | ----------- +| [Barcode4J](http://barcode4j.sourceforge.net/) | Encoder library in Java +| [ZBar](http://zbar.sourceforge.net/) | Decoder in C++, especially for iPhone +| [Zint](http://sourceforge.net/projects/zint/) | Barcode generator ## Links diff --git a/glass-mirror/.gitignore b/glass-mirror/.gitignore deleted file mode 100644 index 0bdd78e13..000000000 --- a/glass-mirror/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target/ -*.iml \ No newline at end of file diff --git a/glass-mirror/pom.xml b/glass-mirror/pom.xml deleted file mode 100755 index fbd7a0ae2..000000000 --- a/glass-mirror/pom.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - 4.0.0 - - glass-mirror - 3.0.0-SNAPSHOT - war - - - - - com.google.apis - google-api-services-mirror - v1-rev38-1.17.0-rc - - - commons-logging - commons-logging - - - - - com.google.http-client - google-http-client-jackson2 - 1.17.0-rc - - - com.google.apis - google-api-services-oauth2 - v2-rev60-1.17.0-rc - - - - com.google.zxing - core - ${project.version} - - - com.google.zxing - javase - ${project.version} - - - - - com.fasterxml.jackson.core - jackson-core - 2.2.3 - - - commons-codec - commons-codec - 1.9 - - - org.apache.httpcomponents - httpclient - 4.3.2 - runtime - - - commons-logging - commons-logging - - - - - org.apache.httpcomponents - httpcore - 4.3.1 - - - - com.google.guava - guava - - - - org.slf4j - slf4j-api - - - org.slf4j - slf4j-jdk14 - runtime - - - org.slf4j - jcl-over-slf4j - runtime - - - javax - javaee-web-api - provided - - - - - - com.google.zxing - zxing-parent - 3.0.0-SNAPSHOT - - - ZXing Google Glass Mirror API app - Experimental Barcode Scanner app for Google Glass Mirror API - - diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/AuthUtil.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/AuthUtil.java deleted file mode 100755 index 2b13bdf81..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/AuthUtil.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2013 Google Inc. - * - * 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. - */ - -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass; - -import com.google.api.client.auth.oauth2.AuthorizationCodeFlow; -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; -import com.google.api.client.http.javanet.NetHttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; -import com.google.api.client.util.store.DataStoreFactory; -import com.google.api.client.util.store.MemoryDataStoreFactory; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; - -/** - * A collection of utility functions that simplify common authentication and - * user identity tasks - * - * @author Sean Owen - * @author Google - */ -@Deprecated -final class AuthUtil { - - private static final Collection SCOPES = - Arrays.asList("https://www.googleapis.com/auth/glass.timeline", - "https://www.googleapis.com/auth/userinfo.profile"); - - private final DataStoreFactory dataStoreFactory; - private final String clientID; - private final String clientSecret; - - AuthUtil(String clientID, String clientSecret) { - dataStoreFactory = new MemoryDataStoreFactory(); - this.clientID = clientID; - this.clientSecret = clientSecret; - } - - /** - * Creates and returns a new {@link AuthorizationCodeFlow} for this app. - */ - public AuthorizationCodeFlow newAuthorizationCodeFlow() throws IOException { - return new GoogleAuthorizationCodeFlow.Builder(new NetHttpTransport(), - new JacksonFactory(), - clientID, - clientSecret, - SCOPES) - .setAccessType("offline").setDataStoreFactory(dataStoreFactory).build(); - } - - public Credential getCredential(String userId) throws IOException { - return userId == null ? null : newAuthorizationCodeFlow().loadCredential(userId); - } - -} diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/DecodeHelper.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/DecodeHelper.java deleted file mode 100755 index e4da27d25..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/DecodeHelper.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.DecodeHintType; -import com.google.zxing.LuminanceSource; -import com.google.zxing.MultiFormatReader; -import com.google.zxing.Reader; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; -import com.google.zxing.client.j2se.BufferedImageLuminanceSource; -import com.google.zxing.common.GlobalHistogramBinarizer; -import com.google.zxing.common.HybridBinarizer; - -import java.awt.color.CMMException; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumMap; -import java.util.EnumSet; -import java.util.Map; - -import javax.imageio.ImageIO; - -/** - * @author Sean Owen - */ -@Deprecated -final class DecodeHelper { - - // No real reason to deal with more than maybe 8.3 megapixels - private static final int MAX_PIXELS = 1 << 23; - private static final Map HINTS; - - static { - HINTS = new EnumMap<>(DecodeHintType.class); - HINTS.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); - HINTS.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.allOf(BarcodeFormat.class)); - } - - private DecodeHelper() { - } - - static Collection processStream(InputStream is) throws IOException { - BufferedImage image; - try { - image = ImageIO.read(is); - } catch (CMMException | IllegalArgumentException e) { - throw new IOException(e); - } - if (image == null) { - throw new IOException("No image"); - } - if (image.getHeight() <= 1 || image.getWidth() <= 1 || - image.getHeight() * image.getWidth() > MAX_PIXELS) { - throw new IOException("Dimensions out of bounds: " + image.getWidth() + 'x' + image.getHeight()); - } - - return processImage(image); - } - - private static Collection processImage(BufferedImage image) { - - Reader reader = new MultiFormatReader(); - LuminanceSource source = new BufferedImageLuminanceSource(image); - BinaryBitmap bitmap = new BinaryBitmap(new GlobalHistogramBinarizer(source)); - Collection results = new ArrayList<>(1); - - if (results.isEmpty()) { - try { - // Look for normal barcode in photo - Result theResult = reader.decode(bitmap, HINTS); - if (theResult != null) { - results.add(theResult); - } - } catch (ReaderException re) { - // continue - } - } - - if (results.isEmpty()) { - try { - // Try again with other binarizer - BinaryBitmap hybridBitmap = new BinaryBitmap(new HybridBinarizer(source)); - Result theResult = reader.decode(hybridBitmap, HINTS); - if (theResult != null) { - results.add(theResult); - } - } catch (ReaderException re) { - // continue - } - } - - return results; - } - -} diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/NewUserSetupServlet.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/NewUserSetupServlet.java deleted file mode 100755 index d9b7f6b2a..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/NewUserSetupServlet.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (C) 2013 Google Inc. - * - * 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. - */ - -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass; - -import java.io.IOException; -import java.text.MessageFormat; -import java.util.Arrays; -import java.util.Collections; -import java.util.ResourceBundle; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.google.api.client.auth.oauth2.AuthorizationCodeFlow; -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.client.auth.oauth2.TokenResponse; -import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; -import com.google.api.client.http.GenericUrl; -import com.google.api.services.mirror.model.Contact; -import com.google.api.services.mirror.model.Subscription; -import com.google.api.services.mirror.model.TimelineItem; -import com.google.zxing.client.glass.mirror.MirrorClient; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This servlet manages the OAuth 2.0 dance. - * - * @author Jenny Murphy - http://google.com/+JennyMurphy - * @author Sean Owen - * @link https://developers.google.com/glass/develop/mirror/authorization - */ -@Deprecated -public final class NewUserSetupServlet extends HttpServlet { - - private static final Logger log = LoggerFactory.getLogger(NewUserSetupServlet.class); - - private static final String BS_ID = "barcode-scanner"; - - private AuthUtil authUtil; - private String baseURL; - private String notificationCallbackURL; - private String subscriptionVerifyToken; - - @Override - public void init(ServletConfig servletConfig) { - ServletContext context = servletConfig.getServletContext(); - authUtil = new AuthUtil(context.getInitParameter("CLIENT_ID"), context.getInitParameter("CLIENT_SECRET")); - baseURL = context.getInitParameter("BASE_URL"); - notificationCallbackURL = baseURL + "/notification"; - subscriptionVerifyToken = context.getInitParameter("SUBSCRIPTION_VERIFY_TOKEN"); - } - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - - String redirect; - - if (request.getParameter("error") != null) { - - log.warn("OAuth error: {}", Arrays.toString(request.getParameterValues("error"))); - redirect = baseURL; - - } else { - - GenericUrl url1 = new GenericUrl(request.getRequestURL().toString()); - url1.setRawPath("/oauth2callback"); - String callbackURL = url1.build(); - String code = request.getParameter("code"); - - if (code == null) { - - log.info("New OAuth flow"); - - AuthorizationCodeFlow flow = authUtil.newAuthorizationCodeFlow(); - GenericUrl url = flow.newAuthorizationUrl().setRedirectUri(callbackURL); - url.set("approval_prompt", "force"); - redirect = url.build(); - - } else { - // If we have a code, finish the OAuth 2.0 dance - - log.info("OAuth response, code: {}", code); - - AuthorizationCodeFlow flow = authUtil.newAuthorizationCodeFlow(); - TokenResponse tokenResponse = flow.newTokenRequest(code).setRedirectUri(callbackURL).execute(); - - // Extract the Google User ID from the ID token in the auth response - String userId = ((GoogleTokenResponse) tokenResponse).parseIdToken().getPayload().getSubject(); - - // Set it into the session - //AuthUtil.setUserId(request, userId); - flow.createAndStoreCredential(tokenResponse, userId); - - ResourceBundle resources = ResourceBundle.getBundle("Strings", request.getLocale()); - - bootstrapNewUser(userId, resources); - - redirect = "glass/index.jspx"; - } - } - - response.sendRedirect(redirect); - } - - private void bootstrapNewUser(String userId, ResourceBundle resources) throws IOException { - Credential credential = authUtil.newAuthorizationCodeFlow().loadCredential(userId); - - String appName = resources.getString("app.title"); - - MirrorClient mirrorClient = MirrorClient.get(); - - boolean contactExists = false; - for (Contact contact : mirrorClient.listContacts(credential)) { - if (BS_ID.equals(contact.getId())) { - contactExists = true; - break; - } - } - - if (!contactExists) { - Contact contact = new Contact(); - contact.setId(BS_ID); - contact.setDisplayName(appName); - contact.setAcceptTypes(Arrays.asList("image/png", "image/jpeg", "image/gif", "image/bmp")); - mirrorClient.insertContact(credential, contact); - } - - boolean subscriptionExists = false; - for (Subscription subscription : mirrorClient.listSubscriptions(credential)) { - if (notificationCallbackURL.equals(subscription.getCallbackUrl())) { - subscriptionExists = true; - break; - } - } - - if (!subscriptionExists) { - Subscription subscription = new Subscription(); - subscription.setCollection("timeline"); - subscription.setOperation(Collections.singletonList("INSERT")); - subscription.setCallbackUrl(notificationCallbackURL); - subscription.setVerifyToken(subscriptionVerifyToken); - subscription.setUserToken(userId); - mirrorClient.insertSubscription(credential, subscription); - } - - TimelineItem timelineItem = new TimelineItem(); - timelineItem.setTitle(MessageFormat.format(resources.getString("setup.welcome.title"), appName)); - timelineItem.setText(MessageFormat.format(resources.getString("setup.welcome.text"), appName)); - mirrorClient.insertTimelineItem(credential, timelineItem); - - } -} diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/NotificationCallable.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/NotificationCallable.java deleted file mode 100755 index 6351565e6..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/NotificationCallable.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass; - -import java.io.IOException; -import java.io.InputStream; -import java.text.MessageFormat; -import java.util.Collection; -import java.util.List; -import java.util.ResourceBundle; -import java.util.concurrent.Callable; - -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.services.mirror.model.Attachment; -import com.google.api.services.mirror.model.TimelineItem; -import com.google.zxing.Result; -import com.google.zxing.client.result.ParsedResult; -import com.google.zxing.client.result.ResultParser; -import com.google.zxing.client.result.URIParsedResult; -import com.google.zxing.client.glass.mirror.MirrorClient; - -/** - * @author Sean Owen - */ -@Deprecated -final class NotificationCallable implements Callable { - - private final Credential credential; - private final String timelineItemID; - private final ResourceBundle resources; - - NotificationCallable(Credential credential, String timelineItemID, ResourceBundle resources) { - this.credential = credential; - this.timelineItemID = timelineItemID; - this.resources = resources; - } - - @Override - public Void call() throws Exception { - MirrorClient mirrorClient = MirrorClient.get(); - TimelineItem timelineItem = mirrorClient.getTimelineItem(credential, timelineItemID); - if (timelineItem == null) { - return null; - } - List attachments = timelineItem.getAttachments(); - if (attachments == null || attachments.isEmpty()) { - return null; - } - Attachment attachment = attachments.get(0); - String attachmentId = attachment.getId(); - - String errorMessage = null; - Collection results = null; - try (InputStream in = mirrorClient.getAttachmentInputStream(credential, timelineItemID, attachmentId)) { - results = DecodeHelper.processStream(in); - } catch (IOException | RuntimeException e) { - errorMessage = e.toString(); - } - - if (results == null || results.isEmpty()) { - - TimelineItem resultTimelineItem = new TimelineItem(); - if (errorMessage == null) { - resultTimelineItem.setTitle(resources.getString("scan.result.notfound.title")); - resultTimelineItem.setText(resources.getString("scan.result.notfound.text")); - } else { - resultTimelineItem.setTitle(resources.getString("scan.result.error.title")); - resultTimelineItem.setText(MessageFormat.format(resources.getString("scan.result.error.text"), errorMessage)); - } - mirrorClient.insertTimelineItem(credential, resultTimelineItem); - - } else { - - for (Result result : results) { - ParsedResult parsedResult = ResultParser.parseResult(result); - - TimelineItem resultTimelineItem = new TimelineItem(); - resultTimelineItem.setText(parsedResult.getDisplayResult()); - resultTimelineItem.setTitle( - MessageFormat.format(resources.getString("scan.result.success.title"), parsedResult.getType())); - - addResultDetailToTimelineItem(parsedResult, resultTimelineItem); - - mirrorClient.insertTimelineItem(credential, resultTimelineItem); - } - - } - - return null; - } - - private static void addResultDetailToTimelineItem(ParsedResult parsedResult, TimelineItem item) { - if (parsedResult instanceof URIParsedResult) { - addURIResultDetailToTimelineItem((URIParsedResult) parsedResult, item); - } - } - - private static void addURIResultDetailToTimelineItem(URIParsedResult parsedResult, TimelineItem item) { - String uri = parsedResult.getURI(); - item.setHtml("" + parsedResult.getDisplayResult() + ""); - item.setCanonicalUrl(uri); - } - -} diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/NotificationServlet.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/NotificationServlet.java deleted file mode 100755 index 43b7c1327..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/NotificationServlet.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass; - -import java.io.IOException; -import java.util.ResourceBundle; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.client.json.JsonObjectParser; -import com.google.api.client.json.jackson2.JacksonFactory; -import com.google.api.services.mirror.model.Notification; - -/** - * @author Sean Owen - * @link https://developers.google.com/glass/develop/mirror/timeline - */ -@Deprecated -public final class NotificationServlet extends HttpServlet { - - private ExecutorService executor; - private final JsonObjectParser jsonParser = new JsonObjectParser(new JacksonFactory()); - private AuthUtil authUtil; - private String subscriptionVerifyToken; - - @Override - public void init(ServletConfig servletConfig) { - ServletContext context = servletConfig.getServletContext(); - authUtil = new AuthUtil(context.getInitParameter("CLIENT_ID"), context.getInitParameter("CLIENT_SECRET")); - executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); - subscriptionVerifyToken = context.getInitParameter("SUBSCRIPTION_VERIFY_TOKEN"); - } - - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { - - Notification notification = jsonParser.parseAndClose(request.getReader(), Notification.class); - - if (!subscriptionVerifyToken.equals(notification.getVerifyToken())) { - response.sendError(HttpServletResponse.SC_BAD_REQUEST); - return; - } - - String userId = notification.getUserToken(); - Credential credential = authUtil.newAuthorizationCodeFlow().loadCredential(userId); - String timelineItemID = notification.getItemId(); - - ResourceBundle resources = ResourceBundle.getBundle("Strings", request.getLocale()); - - executor.submit(new NotificationCallable(credential, timelineItemID, resources)); - } - - @Override - public void destroy() { - executor.shutdownNow(); - } - -} diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/GoogleAPIMirrorClient.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/GoogleAPIMirrorClient.java deleted file mode 100755 index 5ffdfb0bf..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/GoogleAPIMirrorClient.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2013 Google Inc. - * - * 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. - */ - -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass.mirror; - -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.client.http.GenericUrl; -import com.google.api.client.http.HttpResponse; -import com.google.api.client.http.javanet.NetHttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; -import com.google.api.services.mirror.Mirror; -import com.google.api.services.mirror.model.Attachment; -import com.google.api.services.mirror.model.Contact; -import com.google.api.services.mirror.model.Subscription; -import com.google.api.services.mirror.model.TimelineItem; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Collection; - -@Deprecated -final class GoogleAPIMirrorClient extends MirrorClient { - - @Override - public void insertContact(Credential credential, Contact contact) throws IOException { - getMirror(credential).contacts().insert(contact).execute(); - } - - @Override - public Collection listContacts(Credential credential) throws IOException { - return getMirror(credential).contacts().list().execute().getItems(); - } - - @Override - public void insertTimelineItem(Credential credential, TimelineItem item) throws IOException { - getMirror(credential).timeline().insert(item).execute(); - } - - @Override - public void insertSubscription(Credential credential, Subscription subscription) throws IOException { - getMirror(credential).subscriptions().insert(subscription).execute(); - } - - @Override - public Collection listSubscriptions(Credential credential) throws IOException { - return getMirror(credential).subscriptions().list().execute().getItems(); - } - - @Override - public TimelineItem getTimelineItem(Credential credential, String id) throws IOException { - return getMirror(credential).timeline().get(id).execute(); - } - - @Override - public InputStream getAttachmentInputStream(Credential credential, String timelineItemId, String attachmentId) - throws IOException { - Mirror mirrorService = getMirror(credential); - Mirror.Timeline.Attachments attachments = mirrorService.timeline().attachments(); - Attachment attachmentMetadata = attachments.get(timelineItemId, attachmentId).execute(); - HttpResponse resp = - mirrorService.getRequestFactory() - .buildGetRequest(new GenericUrl(attachmentMetadata.getContentUrl())).execute(); - return resp.getContent(); - } - - private static Mirror getMirror(Credential credential) { - return new Mirror.Builder(new NetHttpTransport(), new JacksonFactory(), credential).build(); - } - -} diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/MemoryMirrorClient.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/MemoryMirrorClient.java deleted file mode 100755 index f9e4096c8..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/MemoryMirrorClient.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass.mirror; - -import java.io.InputStream; -import java.util.Collection; -import java.util.Collections; - -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.services.mirror.model.Attachment; -import com.google.api.services.mirror.model.Contact; -import com.google.api.services.mirror.model.Subscription; -import com.google.api.services.mirror.model.TimelineItem; -import com.google.common.collect.Sets; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Deprecated -final class MemoryMirrorClient extends MirrorClient { - - private static final Logger log = LoggerFactory.getLogger(MemoryMirrorClient.class); - - private static final String FAKE_ATTACHMENT_ID = "0123"; - - private final Collection contacts = - Collections.synchronizedCollection(Sets.newHashSet()); - private final Collection subscriptions = - Collections.synchronizedCollection(Sets.newHashSet()); - - @Override - public void insertContact(Credential credential, Contact contact) { - log.info("Insert Contact: {}", contact); - contacts.add(contact); - } - - @Override - public Collection listContacts(Credential credential) { - log.info("Contacts: {}", contacts); - return contacts; - } - - @Override - public void insertTimelineItem(Credential credential, TimelineItem item) { - log.info("Insert Timeline: {}", item); - } - - @Override - public void insertSubscription(Credential credential, Subscription subscription) { - log.info("Insert Subscription: {}", subscription); - subscriptions.add(subscription); - } - - @Override - public Collection listSubscriptions(Credential credential) { - log.info("Subscriptions: {}", subscriptions); - return subscriptions; - } - - @Override - public TimelineItem getTimelineItem(Credential credential, String id) { - log.info("Get Timeline {}", id); - TimelineItem timelineItem = new TimelineItem(); - timelineItem.setId(id); - Attachment fakeAttachment = new Attachment(); - fakeAttachment.setId(FAKE_ATTACHMENT_ID); - timelineItem.setAttachments(Collections.singletonList(fakeAttachment)); - return timelineItem; - } - - @Override - public InputStream getAttachmentInputStream(Credential credential, String timelineItemId, String attachmentId) { - log.info("Get Attachment {} {}", timelineItemId, attachmentId); - if (!FAKE_ATTACHMENT_ID.equals(attachmentId)) { - return null; - } - return MemoryMirrorClient.class.getResourceAsStream("/test.jpg"); - } - -} diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/MirrorClient.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/MirrorClient.java deleted file mode 100755 index 09a2dba05..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/mirror/MirrorClient.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass.mirror; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Collection; - -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.services.mirror.model.Contact; -import com.google.api.services.mirror.model.Subscription; -import com.google.api.services.mirror.model.TimelineItem; - -@Deprecated -public abstract class MirrorClient { - - private static MirrorClient instance = null; - - public static synchronized MirrorClient get() { - if (instance == null) { - instance = new GoogleAPIMirrorClient(); - } - return instance; - } - - public abstract void insertContact(Credential credential, Contact contact) throws IOException; - - public abstract Collection listContacts(Credential credential) throws IOException; - - public abstract void insertTimelineItem(Credential credential, TimelineItem item) throws IOException; - - public abstract void insertSubscription(Credential credential, Subscription subscription) throws IOException; - - public abstract Collection listSubscriptions(Credential credential) throws IOException; - - public abstract TimelineItem getTimelineItem(Credential credential, String id) throws IOException; - - public abstract InputStream getAttachmentInputStream(Credential credential, - String timelineItemId, - String attachmentId) throws IOException; - -} diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/store/MySQLDataStore.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/store/MySQLDataStore.java deleted file mode 100644 index 0c5b65499..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/store/MySQLDataStore.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass.store; - -import com.google.api.client.auth.oauth2.StoredCredential; -import com.google.api.client.util.store.AbstractDataStore; -import com.google.api.client.util.store.DataStore; -import com.google.api.client.util.store.DataStoreFactory; - -import java.io.IOException; -import java.io.Serializable; -import java.util.Collection; -import java.util.Collections; -import java.util.Set; - -@Deprecated -final class MySQLDataStore extends AbstractDataStore { - - MySQLDataStore(DataStoreFactory dataStoreFactory, String id) { - super(dataStoreFactory, id); - } - - @Override - public Set keySet() { - return Collections.singleton(StoredCredential.DEFAULT_DATA_STORE_ID); - } - - @Override - public Collection values() throws IOException { - return null; // TODO - } - - @Override - public V get(String key) throws IOException { - return null; // TODO - } - - @Override - public DataStore set(String key, V value) throws IOException { - return null; // TODO - } - - @Override - public DataStore clear() throws IOException { - return null; // TODO - } - - @Override - public DataStore delete(String key) throws IOException { - return null; // TODO - } - -} diff --git a/glass-mirror/src/main/java/com/google/zxing/client/glass/store/MySQLDataStoreFactory.java b/glass-mirror/src/main/java/com/google/zxing/client/glass/store/MySQLDataStoreFactory.java deleted file mode 100755 index bffab7d88..000000000 --- a/glass-mirror/src/main/java/com/google/zxing/client/glass/store/MySQLDataStoreFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * 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.google.zxing.client.glass.store; - -import com.google.api.client.util.store.AbstractDataStoreFactory; -import com.google.api.client.util.store.DataStore; - -import java.io.Serializable; - -@Deprecated -final class MySQLDataStoreFactory extends AbstractDataStoreFactory { - - @Override - protected DataStore createDataStore(String id) { - return new MySQLDataStore<>(this, id); - } - -} diff --git a/glass-mirror/src/main/resources/Strings.properties b/glass-mirror/src/main/resources/Strings.properties deleted file mode 100755 index 0c2c86193..000000000 --- a/glass-mirror/src/main/resources/Strings.properties +++ /dev/null @@ -1,8 +0,0 @@ -app.title=Barcode Scanner for Google Glass -setup.welcome.title=Welcome to {0} -setup.welcome.text=To read a barcode, share a photo of it with the contact called '{0}' -scan.result.notfound.title=No Barcode Found -scan.result.notfound.text=Sorry, no barcode could be found it that image. Try sharing another image. -scan.result.error.title=Error -scan.result.error.text=An error occurred while looking for a barcode: {0} -scan.result.success.title={0} Barcode \ No newline at end of file diff --git a/glass-mirror/src/main/resources/test.jpg b/glass-mirror/src/main/resources/test.jpg deleted file mode 100755 index ca9ceef7f144227f60264c33c7a05ae4c1950115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51304 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 diff --git a/glass-mirror/src/main/webapp/WEB-INF/web.xml b/glass-mirror/src/main/webapp/WEB-INF/web.xml deleted file mode 100755 index 87e1120cb..000000000 --- a/glass-mirror/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - CLIENT_ID - TODO - - - CLIENT_SECRET - TODO - - - - BASE_URL - http://example.org/todo - - - - SUBSCRIPTION_VERIFY_TOKEN - TODO - - - - OAuth2CallbackServlet - com.google.zxing.client.glass.NewUserSetupServlet - - - NotificationServlet - com.google.zxing.client.glass.NotificationServlet - - - - OAuth2CallbackServlet - /oauth2callback - /start - - - NotificationServlet - /notification - - - - java.lang.Throwable - /error.jspx - - - 400 - /error.jspx - - - 401 - /error.jspx - - - 404 - /error.jspx - - - 405 - /error.jspx - - - 500 - /error.jspx - - - 501 - /error.jspx - - - 503 - /error.jspx - - - diff --git a/glass-mirror/src/main/webapp/error.jspx b/glass-mirror/src/main/webapp/error.jspx deleted file mode 100755 index cb8cfb872..000000000 --- a/glass-mirror/src/main/webapp/error.jspx +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - -]]> - - -Error - - - -

Error ${pageContext.errorData.statusCode} : ${pageContext.errorData.requestURI}

-

-
-Throwable t = pageContext.getErrorData().getThrowable();
-if (t != null) {
-  t.printStackTrace(new PrintWriter(out));
-}
-
-

- - -
\ No newline at end of file diff --git a/glass-mirror/src/main/webapp/glass/index.jspx b/glass-mirror/src/main/webapp/glass/index.jspx deleted file mode 100755 index d15710ee4..000000000 --- a/glass-mirror/src/main/webapp/glass/index.jspx +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -]]> - - - - Barcode Scanner for Google Glass - - - -

Success

- - -
diff --git a/glass-mirror/src/main/webapp/glass/style.css b/glass-mirror/src/main/webapp/glass/style.css deleted file mode 100755 index 6eae79835..000000000 --- a/glass-mirror/src/main/webapp/glass/style.css +++ /dev/null @@ -1,3 +0,0 @@ -body {background-color:black;margin:0;padding:0} -body,th,td,p {font-family:Helvetica,Arial,sans-serif;color:white} -td {vertical-align:top} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 1514728cb..e38710f96 100644 --- a/pom.xml +++ b/pom.xml @@ -78,10 +78,6 @@ android androidtest --> - -