/* * Copyright 2011 cruxframework.org. * * 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 org.cruxframework.crux.tools.servicemap; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.util.Map; import java.util.Properties; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.cruxframework.crux.core.server.dispatch.Services; import org.cruxframework.crux.core.server.rest.annotation.RestService; import org.cruxframework.crux.scanner.ClassScanner; import org.cruxframework.crux.tools.AbstractMapper; import org.cruxframework.crux.tools.parameters.ConsoleParameter; import org.cruxframework.crux.tools.parameters.ConsoleParametersProcessor; import com.google.gwt.user.client.rpc.RemoteService; /** * A tool for create a map of Crux remote service interfaces and * implementation classes * @author Thiago da Rosa de Bustamante */ public class ServiceMapper extends AbstractMapper { private static final Log logger = LogFactory.getLog(ServiceMapper.class); /** * Generates Remote Service map */ public void generateRestServicesMap() { try { File metaInfFile = getMetaInfFile(); File serviceMapFile = new File(metaInfFile, "crux-rest"); if (serviceMapFile.exists() && !isOverride()) { logger.info("REST Service map already exists. Skipping generation..."); return; } initializeScannerURLs(); Set<String> restServices = ClassScanner.searchClassesByAnnotation(RestService.class); Properties cruxRest = new Properties(); if (restServices != null) { for (String service : restServices) { try { Class<?> serviceClass = Class.forName(service); RestService annot = serviceClass.getAnnotation(RestService.class); if (cruxRest.containsKey(annot.value())) { throw new ServiceMapperException("Duplicated rest service [{"+annot.value()+"}]. Overiding previous registration..."); } cruxRest.put(annot.value(), service); } catch (ClassNotFoundException e) { throw new ServiceMapperException("Error initializing rest service class.",e); } } } cruxRest.store(new FileOutputStream(serviceMapFile), "Crux RestServices implementations"); } catch (IOException e) { throw new ServiceMapperException("Error creating rest service map", e); } } /** * Generates Remote Service map */ public void generateServicesMap() { try { File metaInfFile = getMetaInfFile(); File serviceMapFile = new File(metaInfFile, "crux-remote"); if (serviceMapFile.exists() && !isOverride()) { logger.info("Service map already exists. Skipping generation..."); return; } initializeScannerURLs(); Set<String> searchClassesByInterface = ClassScanner.searchClassesByInterface(RemoteService.class); Properties cruxRemote = new Properties(); for (String serviceClass : searchClassesByInterface) { Class<?> clazz = Class.forName(serviceClass); if (clazz.isInterface()) { Class<?> service = Services.getService(serviceClass); if (service != null) { cruxRemote.put(serviceClass, service.getCanonicalName()); } } } if (metaInfFile.exists()) { if (!metaInfFile.isDirectory()) { throw new ServiceMapperException("Can not create a META-INF directory on "+getProjectDir().getCanonicalPath()); } } else { metaInfFile.mkdirs(); } cruxRemote.store(new FileOutputStream(serviceMapFile), "Crux RemoteServices implementations"); } catch (IOException e) { throw new ServiceMapperException("Error creating remote service map", e); } catch (ClassNotFoundException e) { throw new ServiceMapperException("Error creating remote service map", e); } } /** * Starts ServiceMapper program * @param args * @throws MalformedURLException */ public static void main(String[] args) throws MalformedURLException { ServiceMapper serviceMapper = new ServiceMapper(); ConsoleParametersProcessor parametersProcessor = serviceMapper.createParametersProcessor("serviceMapper"); Map<String, ConsoleParameter> parameters = parametersProcessor.processConsoleParameters(args); if (parameters.containsKey("-help") || parameters.containsKey("-h")) { parametersProcessor.showsUsageScreen(); } else { serviceMapper.processParameters(parameters.values()); serviceMapper.generateServicesMap(); serviceMapper.generateRestServicesMap(); } } }