/*******************************************************************************
* Copyright (c) 2008-2011 Chair for Applied Software Engineering,
* Technische Universitaet Muenchen.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
******************************************************************************/
package org.eclipse.emf.emfstore.server.model.url.impl;
import java.net.MalformedURLException;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.impl.EFactoryImpl;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.emfstore.common.model.ModelElementId;
import org.eclipse.emf.emfstore.server.model.ModelFactory;
import org.eclipse.emf.emfstore.server.model.ProjectId;
import org.eclipse.emf.emfstore.server.model.url.ModelElementUrl;
import org.eclipse.emf.emfstore.server.model.url.ModelElementUrlFragment;
import org.eclipse.emf.emfstore.server.model.url.ProjectUrlFragment;
import org.eclipse.emf.emfstore.server.model.url.ServerUrl;
import org.eclipse.emf.emfstore.server.model.url.UrlFactory;
import org.eclipse.emf.emfstore.server.model.url.UrlPackage;
/**
* <!-- begin-user-doc --> An implementation of the model <b>Factory</b>. <!-- end-user-doc -->
* @generated
*/
public class UrlFactoryImpl extends EFactoryImpl implements UrlFactory {
/**
* The prefix for all EMFStore URLs.
*
* @generated NOT
*/
public static final String PREFIX = "emfstore://";
/**
* The standard parsing exception message.
*
* @generated NOT
*/
private static final String EXCEPTION_MESSAGE = "Invalid EMFStore URL!";
/**
* Creates the default factory implementation.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public static UrlFactory init() {
try {
UrlFactory theUrlFactory = (UrlFactory)EPackage.Registry.INSTANCE.getEFactory("http://eclipse.org/emf/emfstore/server/model/url");
if (theUrlFactory != null) {
return theUrlFactory;
}
}
catch (Exception exception) {
EcorePlugin.INSTANCE.log(exception);
}
return new UrlFactoryImpl();
}
/**
* Creates an instance of the factory.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public UrlFactoryImpl() {
super();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public EObject create(EClass eClass) {
switch (eClass.getClassifierID()) {
case UrlPackage.SERVER_URL: return createServerUrl();
case UrlPackage.PROJECT_URL_FRAGMENT: return createProjectUrlFragment();
case UrlPackage.MODEL_ELEMENT_URL_FRAGMENT: return createModelElementUrlFragment();
case UrlPackage.MODEL_ELEMENT_URL: return createModelElementUrl();
default:
throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ServerUrl createServerUrl() {
ServerUrlImpl serverUrl = new ServerUrlImpl();
return serverUrl;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ProjectUrlFragment createProjectUrlFragment() {
ProjectUrlFragmentImpl projectUrlFragment = new ProjectUrlFragmentImpl();
return projectUrlFragment;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ModelElementUrlFragment createModelElementUrlFragment() {
ModelElementUrlFragmentImpl modelElementUrlFragment = new ModelElementUrlFragmentImpl();
return modelElementUrlFragment;
}
// begin of custom code
/**
* {@inheritDoc}
*/
public ModelElementUrl createModelElementUrl(String url) throws MalformedURLException {
ModelElementUrl modelURL = createModelElementUrl();
ModelElementUrlFragment modelFragment = createModelElementUrlFragment();
ProjectUrlFragment projectFragment = createProjectUrlFragment();
ServerUrl serverFragment = createServerUrl();
modelURL.setModelElementUrlFragment(modelFragment);
modelURL.setProjectUrlFragment(projectFragment);
modelURL.setServerUrl(serverFragment);
if (url.startsWith(PREFIX)) {
int trail = 0;
if (url.endsWith("/")) {
trail = 1;
}
String text = url.substring(PREFIX.length(), url.length() - trail);
String[] elements = text.split("/");
if (elements.length >= 3) {
String[] server = elements[0].split(":");
if (server.length != 2) {
throw new MalformedURLException(EXCEPTION_MESSAGE);
}
serverFragment.setHostName(server[0]);
try {
serverFragment.setPort(Integer.parseInt(server[1]));
} catch (NumberFormatException e) {
throw new MalformedURLException(EXCEPTION_MESSAGE);
}
String[] project = elements[1].split("%");
if (project.length != 2) {
throw new MalformedURLException(EXCEPTION_MESSAGE);
}
projectFragment.setName(project[0]);
ProjectId projectId = ModelFactory.eINSTANCE.createProjectId();
projectId.setId(project[1]);
projectFragment.setProjectId(projectId);
StringBuilder model = new StringBuilder();
for (int i = 2; i < elements.length; i++) {
model.append(elements[i]);
}
final String string = model.toString();
int p = string.lastIndexOf("%");
if (p == -1) {
throw new MalformedURLException(EXCEPTION_MESSAGE);
}
modelFragment.setName(string.substring(0, p));
ModelElementId modelElementId = org.eclipse.emf.emfstore.common.model.ModelFactory.eINSTANCE
.createModelElementId();
modelElementId.setId(string.substring(p + 1));
modelFragment.setModelElementId(modelElementId);
}
}
return modelURL;
}
// end of custom code
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ModelElementUrl createModelElementUrl() {
ModelElementUrlImpl modelElementUrl = new ModelElementUrlImpl();
return modelElementUrl;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public UrlPackage getUrlPackage() {
return (UrlPackage)getEPackage();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @deprecated
* @generated
*/
@Deprecated
public static UrlPackage getPackage() {
return UrlPackage.eINSTANCE;
}
} // UrlFactoryImpl