/*
* Copyright 2016 ArcBees 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.
*/
package com.gwtplatform.mvp.processors.proxy;
import java.util.List;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.Name;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import com.gwtplatform.mvp.client.proxy.Proxy;
import com.gwtplatform.mvp.client.proxy.ProxyPlace;
import com.gwtplatform.mvp.processors.proxy.ProxyDetails.Factory;
import com.gwtplatform.processors.tools.exceptions.UnableToProcessException;
import com.gwtplatform.processors.tools.logger.Logger;
import com.gwtplatform.processors.tools.utils.Utils;
import static com.google.auto.common.MoreElements.asType;
import static com.google.auto.common.MoreElements.hasModifiers;
import static com.google.auto.common.MoreTypes.asTypeElement;
public class ProxyDetailsFactory implements Factory {
private final Logger logger;
private final Utils utils;
public ProxyDetailsFactory(
Logger logger,
Utils utils) {
this.logger = logger;
this.utils = utils;
}
@Override
public ProxyDetails create(Element element) {
validateModifiers(element);
TypeElement typeElement = asType(element);
List<? extends TypeMirror> parents = typeElement.getInterfaces();
TypeMirror proxyPlaceType = null;
TypeMirror proxyType = null;
for (TypeMirror parentMirror : parents) {
TypeElement parentElement = asTypeElement(parentMirror);
Name parentName = parentElement.getQualifiedName();
if (parentName.contentEquals(ProxyPlace.class.getCanonicalName())) {
proxyPlaceType = parentMirror;
} else if (parentName.contentEquals(Proxy.class.getCanonicalName())) {
proxyType = parentMirror;
}
}
if (proxyPlaceType != null) {
return new ProxyPlaceDetails(logger, utils, typeElement, proxyPlaceType);
} else if (proxyType != null) {
return new SimpleProxyDetails(logger, utils, typeElement, proxyType);
}
logger.error().context(element).log("Proxies must extend 'Proxy<?>' or 'ProxyPlace<?>'.");
throw new UnableToProcessException();
}
private void validateModifiers(Element element) {
if (element.getKind() != ElementKind.INTERFACE) {
logger.error().context(element).log("Proxies must be interfaces.");
throw new UnableToProcessException();
} else if (hasModifiers(Modifier.PRIVATE).apply(element)) {
logger.error().context(element).log("Proxies must not be private. Package-local is recommended.");
throw new UnableToProcessException();
}
}
}